Grafana MCP server tool surface audit

C77/100composite score
Token footprint
~16,794
Tools
65
Findings
86
Scanned

Engine mcp-surface-lint@0.3.3 · reported as mcp-grafana v(devel)

Every conversation with the Grafana MCP server begins with 65 tool definitions already in context — about 16,794 tokens of it. MCP Surface Lint scores that surface 77 out of 100 (grade C), with 86 scored findings spread across 5 of the six rule categories.

The spread runs from 100/100 for naming down to 36/100 for design. It is catalogued here under Observability, alongside other servers agents reach for in the same kind of work.

Token footprint

At 16,794 tokens the surface takes about 8% of a 200,000-token context window, and it takes it on every turn — this is rent, not a one-off cost. That averages 258 tokens per tool definition, counted with the o200k_base encoding.

That lands exactly on the Observability median of 16,794 tokens.

surface70
naming100
descriptions97
schemas68
annotations88
design36

Findings

Every finding below names the rule behind it and the tool it fired on.

28 findings come from `schemas/param-desc-missing`. Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes. On this surface it fires on `analyze_loki_labels`, `create_incident` and `list_prometheus_label_names`, among 3 others.

`design/list-no-limit` accounts for 16 findings. A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less. On this surface it fires on `find_error_pattern_logs`, `find_slow_requests` and `get_dashboard_panel_queries`, among 13 others.

`schemas/loose` contributes 10 findings. Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes. On this surface it fires on `alerting_manage_rules`, `create_annotation` and `create_datasource`, among 5 others.

Grafana's surface raises 9 further rules — `design/overlap-cluster`, `annotations/missing-hints`, `design/confusable-params`, `design/enum-in-prose`, `schemas/complexity-budget`, `design/crud-mirror`, `descriptions/too-long`, `surface/token-budget` and `surface/tool-budget` — listed in full below.

error 1 finding

Findings that actively harm tool selection.

Server exposes 65 tools (error threshold 40 exceeded). Consider consolidating into fewer intent-shaped tools.

Tool selection accuracy degrades as the surface grows: more near-neighbours to confuse, more tokens spent before the first user message. Fewer, intent-shaped tools outperform one-tool-per-endpoint surfaces.

warn 85 findings

Findings that measurably degrade tool selection.

annotations/missing-hintsadd_activity_to_incident
Mutating tool "add_activity_to_incident" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.

readOnlyHint/destructiveHint are machine-readable: clients use them to decide when to ask the user for confirmation. Prose like 'confirm with the user first' is invisible to that machinery.

annotations/missing-hintscreate_annotation
Mutating tool "create_annotation" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.

readOnlyHint/destructiveHint are machine-readable: clients use them to decide when to ask the user for confirmation. Prose like 'confirm with the user first' is invisible to that machinery.

Mutating tool "create_folder" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.

readOnlyHint/destructiveHint are machine-readable: clients use them to decide when to ask the user for confirmation. Prose like 'confirm with the user first' is invisible to that machinery.

Mutating tool "create_incident" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.

readOnlyHint/destructiveHint are machine-readable: clients use them to decide when to ask the user for confirmation. Prose like 'confirm with the user first' is invisible to that machinery.

Mutating tool "create_snapshot" declares neither readOnlyHint nor destructiveHint — clients cannot gate it for confirmation.

readOnlyHint/destructiveHint are machine-readable: clients use them to decide when to ask the user for confirmation. Prose like 'confirm with the user first' is invisible to that machinery.

descriptions/too-longupdate_dashboard
Description is 2177 chars (maximum 1500) — move detail into parameter descriptions.

Very long tool descriptions are paid for in every conversation. Detail that only matters once a parameter is used belongs in that parameter's description.

Same parameter spelled 3 ways across tools — pick one spelling.

The same concept spelled differently across tools (hotel_id vs hotelId vs id) makes the model carry a per-tool spelling table and produces cross-tool argument bleed. One concept, one name, everywhere.

"datasource_uid" (alerting_manage_routing, alerting_manage_rules) vs "datasourceUid" (analyze_loki_labels, generate_deeplink, list_loki_label_names, list_loki_label_values, list_prometheus_label_names, list_prometheus_label_values, list_prometheus_metric_metadata, list_prometheus_metric_names, query_loki_logs, query_loki_patterns, query_loki_stats, query_prometheus, query_prometheus_histogram) vs "data_source_uid" (list_pyroscope_label_names, list_pyroscope_label_values, list_pyroscope_profile_types, query_pyroscope)

Same parameter spelled 2 ways across tools — pick one spelling.

The same concept spelled differently across tools (hotel_id vs hotelId vs id) makes the model carry a per-tool spelling table and produces cross-tool argument bleed. One concept, one name, everywhere.

"folder_uid" (alerting_manage_rules) vs "folderUid" (update_dashboard)

Same parameter spelled 2 ways across tools — pick one spelling.

The same concept spelled differently across tools (hotel_id vs hotelId vs id) makes the model carry a per-tool spelling table and produces cross-tool argument bleed. One concept, one name, everywhere.

"endRfc3339" (analyze_loki_labels, list_loki_label_names, list_loki_label_values, list_prometheus_label_names, list_prometheus_label_values, list_prometheus_metric_names, query_loki_logs, query_loki_patterns, query_loki_stats) vs "end_rfc_3339" (list_pyroscope_label_names, list_pyroscope_label_values, list_pyroscope_profile_types, query_pyroscope)

Same parameter spelled 2 ways across tools — pick one spelling.

The same concept spelled differently across tools (hotel_id vs hotelId vs id) makes the model carry a per-tool spelling table and produces cross-tool argument bleed. One concept, one name, everywhere.

"startRfc3339" (analyze_loki_labels, list_loki_label_names, list_loki_label_values, list_prometheus_label_names, list_prometheus_label_values, list_prometheus_metric_names, query_loki_logs, query_loki_patterns, query_loki_stats) vs "start_rfc_3339" (list_pyroscope_label_names, list_pyroscope_label_values, list_pyroscope_profile_types, query_pyroscope)

Same parameter spelled 2 ways across tools — pick one spelling.

The same concept spelled differently across tools (hotel_id vs hotelId vs id) makes the model carry a per-tool spelling table and produces cross-tool argument bleed. One concept, one name, everywhere.

"queryType" (query_loki_logs, query_prometheus) vs "query_type" (query_pyroscope)

CRUD mirror over "annotation": 3 tools spanning 3 verb classes — one-tool-per-endpoint shape. Consider a workflow-shaped consolidation.

A get/create/update/delete family over one noun is the fingerprint of an OpenAPI-autogenerated surface: it mirrors your REST API, not your users' intents. Agents work in workflows, not endpoints — consolidate around tasks.

create_annotation, get_annotations, update_annotation

CRUD mirror over "datasource": 4 tools spanning 3 verb classes — one-tool-per-endpoint shape. Consider a workflow-shaped consolidation.

A get/create/update/delete family over one noun is the fingerprint of an OpenAPI-autogenerated surface: it mirrors your REST API, not your users' intents. Agents work in workflows, not endpoints — consolidate around tasks.

create_datasource, get_datasource, list_datasources, update_datasource

CRUD mirror over "snapshot": 4 tools spanning 3 verb classes — one-tool-per-endpoint shape. Consider a workflow-shaped consolidation.

A get/create/update/delete family over one noun is the fingerprint of an OpenAPI-autogenerated surface: it mirrors your REST API, not your users' intents. Agents work in workflows, not endpoints — consolidate around tasks.

create_snapshot, delete_snapshot, get_snapshot, list_snapshots

design/enum-in-proselist_alert_groups
Parameter "state" enumerates its values in prose but declares no enum.

Values enumerated in prose ('one of: a, b, c') are invisible to schema validation: the model can misspell them and the server only finds out at call time. If the value set is closed, encode it as an enum.

Filter by alert group state (one of: new, acknowledged, resolved, silenced)

design/enum-in-proselist_incidents
Parameter "status" enumerates its values in prose but declares no enum.

Values enumerated in prose ('one of: a, b, c') are invisible to schema validation: the model can misspell them and the server only finds out at call time. If the value set is closed, encode it as an enum.

The status of the incidents to include. Valid values: 'active', 'resolved'

design/enum-in-proselist_prometheus_label_names
Parameter "type" enumerates its values in prose but declares no enum.

Values enumerated in prose ('one of: a, b, c') are invisible to schema validation: the model can misspell them and the server only finds out at call time. If the value set is closed, encode it as an enum.

One of the '=' or '!=' or '=~' or '!~'

design/enum-in-proselist_prometheus_label_values
Parameter "type" enumerates its values in prose but declares no enum.

Values enumerated in prose ('one of: a, b, c') are invisible to schema validation: the model can misspell them and the server only finds out at call time. If the value set is closed, encode it as an enum.

One of the '=' or '!=' or '=~' or '!~'

design/list-no-limitfind_error_pattern_logs
"find_error_pattern_logs" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitfind_slow_requests
"find_slow_requests" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitget_dashboard_panel_queries
"get_dashboard_panel_queries" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_loki_label_names
"list_loki_label_names" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_loki_label_values
"list_loki_label_values" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_provisioning_repositories
"list_provisioning_repositories" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_pyroscope_label_names
"list_pyroscope_label_names" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_pyroscope_label_values
"list_pyroscope_label_values" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_pyroscope_profile_types
"list_pyroscope_profile_types" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitquery_loki_patterns
"query_loki_patterns" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitquery_loki_stats
"query_loki_stats" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitquery_prometheus
"query_prometheus" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitquery_prometheus_histogram
"query_prometheus_histogram" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitquery_pyroscope
"query_pyroscope" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitsearch_folders
"search_folders" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitsearch_plugin_information
"search_plugin_information" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

4 tools share the name prefix "get_dashboard" — likely one tool with include-flags or a mode parameter.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

get_dashboard_by_uid, get_dashboard_panel_queries, get_dashboard_property, get_dashboard_summary

3 tools share the name prefix "list_oncall" — likely one tool with include-flags or a mode parameter.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

list_oncall_schedules, list_oncall_teams, list_oncall_users

4 tools share the name prefix "list_prometheus" — likely one tool with include-flags or a mode parameter.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

list_prometheus_label_names, list_prometheus_label_values, list_prometheus_metric_metadata, list_prometheus_metric_names

3 tools share the name prefix "list_pyroscope" — likely one tool with include-flags or a mode parameter.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

list_pyroscope_label_names, list_pyroscope_label_values, list_pyroscope_profile_types

3 tools share the name prefix "query_loki" — likely one tool with include-flags or a mode parameter.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

query_loki_logs, query_loki_patterns, query_loki_stats

3 tools have overlapping descriptions (trigram Jaccard up to 0.74) — consolidation candidates.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

list_loki_label_names, list_pyroscope_label_names, list_pyroscope_label_values

2 tools have overlapping descriptions (trigram Jaccard up to 0.70) — consolidation candidates.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

list_prometheus_label_names, list_prometheus_label_values

2 tools have overlapping descriptions (trigram Jaccard up to 0.72) — consolidation candidates.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

search_dashboards, search_folders

schemas/complexity-budgetalerting_manage_rules
Input schema has 28 top-level properties (budget 12).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetanalyze_loki_labels
Input schema nests 4 levels deep (budget 3).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetlist_prometheus_label_names
Input schema nests 5 levels deep (budget 3).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/complexity-budgetlist_prometheus_label_values
Input schema nests 5 levels deep (budget 3).

Deeply nested inputs, very wide property lists, and stacked oneOf/anyOf force the model to solve a constraint puzzle before every call. Flatter, narrower inputs get filled correctly more often.

schemas/loosealerting_manage_rules
Bare "type: object" with no properties at /inputSchema/properties/data/items — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosealerting_manage_rules
Bare "type: object" with no properties at /inputSchema/properties/notification_settings — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosealerting_manage_rules
Bare "type: object" with no properties at /inputSchema/properties/record — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosecreate_annotation
Bare "type: object" with no properties at /inputSchema/properties/data — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosecreate_datasource
Bare "type: object" with no properties at /inputSchema/properties/fields — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosecreate_snapshot
Bare "type: object" with no properties at /inputSchema/properties/dashboard — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosegenerate_deeplink
Bare "type: object" with no properties at /inputSchema/properties/queries/items — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseupdate_annotation
Bare "type: object" with no properties at /inputSchema/properties/data — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseupdate_dashboard
Bare "type: object" with no properties at /inputSchema/properties/dashboard — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseupdate_datasource
Bare "type: object" with no properties at /inputSchema/properties/jsonData — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "endRfc3339" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "expectedBaseLabels" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "maxLabels" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "startRfc3339" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "name" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "uniqueValues" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "sampleValues" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "unbounded" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "usedInQueries" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "valueKind" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "queueTimeSec" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "chunkRefsFetchTimeSec" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "storeChunksDownloadTimeSec" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "executionTimeSec" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "totalBytes" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "cacheChunkReqs" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "totalLines" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinganalyze_loki_labels
Parameter "postFilterLines" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "key" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "label" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "description" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "colorHex" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinglist_prometheus_label_names
Parameter "filters" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinglist_prometheus_label_values
Parameter "filters" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinglist_pyroscope_label_names
Parameter "matchers" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missingsuggest_loki_alloy_label_config
Parameter "componentName" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missingsuggest_loki_alloy_label_config
Parameter "forwardTo" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missingsuggest_loki_alloy_label_config
Parameter "normalizeLogLevel" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

tools/list footprint is ~16794 tokens (o200k_base, approximate) — above the 10000-token budget. Every conversation pays this before the first user message.

The serialized tools/list payload is injected into every conversation that connects the server, before any work happens. Its token cost is a per-message tax.

info 3 findings

Advisory only — these deduct nothing from the score.

design/client-directivescreate_datasource
Description contains 1 client-directive sentence(s) (~33 tokens) about rendering or other tools — describe what the tool does; put client behaviour elsewhere.

A description should say what the tool does. Imperatives aimed at the client ('RENDER RESULTS IMMEDIATELY', 'do not call tool X') are prompt injection into your own surface: paid for in every conversation, unevenly obeyed, and when copy-pasted across tools they drown the words that actually disambiguate. Escalates to warn when the same directive block appears in multiple tools.

Second call: provide the type, the display name in the top-level name argument, schemaReviewed=true, and the fields map populated with values confirmed by the user.

design/negative-guidance-presentalerting_manage_routing
Good pattern: "alerting_manage_routing" documents when NOT to use it. Preserve this in any consolidation.

Positive check. 'When NOT to use this tool' guidance is one of the highest-value lines a description can carry — it prevents speculative calls that waste quota and context. Credit it; keep it during any consolidation.

When NOT to use:

Good pattern: "alerting_manage_rules" documents when NOT to use it. Preserve this in any consolidation.

Positive check. 'When NOT to use this tool' guidance is one of the highest-value lines a description can carry — it prevents speculative calls that waste quota and context. Credit it; keep it during any consolidation.

When NOT to use:

What this surface does well

Grafana scores a full 100 in naming, which is to say the tool names follow one convention end to end.

Tool inventory

The heaviest definition is `alerting_manage_rules` at 1,368 tokens, roughly 8% of the total; the lightest, `delete_snapshot`, costs 65. Every tool carries a description, ranging from 42 to 2,177 characters.

All 65 declare annotations, so a client can tell a read from a write before running one. Across the surface, schemas carry 5 top-level parameters on average and reach a maximum depth of 5.

All 65 tools as published, heaviest first. Token counts use the o200k_base encoding and are approximate.

Every tool on this surface with its token cost and schema shape.
ToolTokensDescriptionParamsRequiredDepthAnnotations
alerting_manage_rules1,368461 chars2812yes
update_dashboard1,0062177 chars703yes
get_panel_image602428 chars1002yes
query_loki_logs567791 chars821yes
generate_deeplink562600 chars912yes
query_prometheus437340 chars731yes
create_datasource419652 chars1021yes
alerting_manage_routing414561 chars611yes
list_alert_groups407503 chars902yes
query_loki_stats407837 chars421yes
query_pyroscope403451 chars922yes
list_prometheus_label_values392264 chars725yes
query_prometheus_histogram390312 chars931yes
list_prometheus_label_names365156 chars615yes
analyze_loki_labels360258 chars804yes
query_loki_patterns333514 chars521yes
get_dashboard_property318680 chars221yes
list_prometheus_metric_names316350 chars711yes
list_pyroscope_label_values306407 chars521yes
list_pyroscope_label_names280452 chars411yes
list_loki_label_values270324 chars421yes
get_assertions268100 chars721yes
list_pyroscope_profile_types266442 chars311yes
create_annotation259125 chars1102yes
create_incident259244 chars833yes
get_annotations24183 chars1002yes
grafana_api_request235224 chars511yes
validate_provisioning_file231441 chars421yes
list_loki_label_names222262 chars311yes
get_dashboard_panel_queries221507 chars311yes
search_plugin_information189531 chars111yes
update_datasource186121 chars811yes
create_snapshot183115 chars611yes
list_prometheus_metric_metadata181132 chars511yes
get_dashboard_by_uid177560 chars111yes
list_oncall_users172251 chars301yes
find_error_pattern_logs170172 chars421yes
list_oncall_schedules166256 chars301yes
install_plugin163198 chars211yes
suggest_loki_alloy_label_config159166 chars512yes
update_annotation159140 chars602yes
find_slow_requests158115 chars421yes
list_datasources152145 chars301yes
get_sift_investigation151153 chars111yes
add_activity_to_incident150185 chars321yes
list_provisioning_repositories149339 chars101yes
get_sift_analysis148147 chars221yes
get_datasource140260 chars201yes
get_plugin134273 chars111yes
list_incidents134158 chars301yes
search_dashboards133139 chars301yes
check_datasources_health11972 chars302yes
create_folder11986 chars311yes
get_current_oncall_users110178 chars111yes
get_oncall_shift105201 chars111yes
get_dashboard_summary103236 chars111yes
list_snapshots9878 chars201yes
list_sift_investigations93120 chars101yes
get_annotation_tags9199 chars201yes
get_alert_group8995 chars111yes
get_incident88137 chars111yes
list_oncall_teams83112 chars101yes
search_folders80109 chars101yes
get_snapshot7181 chars111yes
delete_snapshot6542 chars111yes

How this compares

Within Observability this is rank 1 of 1 scanned servers — exactly on the category median of 77.

The closest comparisons in this directory are Notion, MongoDB and Chrome DevTools, which sit nearest on score and face the same kind of surface-design pressure.

Category
Observability
Rank in category
1
Category median score
77
Category median tokens
16,794
Want this surface fixed, not just measured?

A fix plan turns these findings into an ordered set of changes with the token saving of each one.

Get a fix plan

This page is a static analysis of Grafana's published tools/list surface on the date shown. It is not a security review, a performance benchmark, or a judgement of the product behind the surface. Read how the score is computed, or browse every audited server.