rrdmcp
This server exposes Munin RRD monitoring data (and optionally sar/wtmp/btmp logs) to an LLM via MCP tools, letting you query hosts, plugins, fields, time-series metrics, and login events, and render graphs.
Discovery:
list_hostslists all (group, host) pairs;list_pluginslists a host's plugins;list_fieldslists a plugin's fields;get_metadatareturns detailed metadata for a plugin or a single field.Time-series analysis:
fetch_seriesretrieves raw points, resolution-bucketed aggregates (avg/min/max/count), whole-range summaries, or top-N buckets (e.g. highest/lowest days) for a given field.Graph rendering:
render_graphgenerates a PNG graph overlaying specified fields of a plugin.Login/logout data (optional):
list_login_sourcesdiscovers wtmp/btmp sources;list_login_eventsfetches raw login-event records for a host, with optional limit and total count.Flexible time ranges:
start/endaccept unix timestamps, ISO 8601, or rrdtool-style expressions (e.g.-1d,now) for Munin data.Transport options: Supports both
stdioandstreamable-httpMCP transports, configurable via env vars or CLI flags.
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., "@rrdmcp Which days this month had the highest CPU usage on web1?"
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.
rrdmcp
An MCP server that exposes Munin's RRD metric data to an LLM, so you can ask
questions about your monitored hosts in plain language instead of writing
rrdtool incantations or one-off scripts. Supports both stdio and
streamable-http transports.
What it's for
Munin collects rich time-series data (CPU, memory, disk, network, custom
plugins...) but analyzing it usually means digging through graph images or
writing throwaway scripts against the RRD files. rrdmcp exposes that data
directly to an LLM through a handful of tools, so you can just ask:
"Which days this month had the highest CPU usage?"
"Free memory has been dropping — is that a trend or a one-off?"
"fail2ban's ban count spiked a few days ago — does that line up with higher process counts or TCP resets on this host?"
"Is disk usage on this host trending toward full, and how soon?"
The server deliberately stays "dumb" about interpretation: it discovers hosts/plugins/fields, fetches raw or lightly-aggregated series (bucketed averages, whole-range summaries, top-N rankings), and renders graphs — but leaves judgment calls (what counts as "high", whether two metrics are actually related, what to do about it) to the LLM doing the analysis. This keeps the tool surface small and lets the LLM reason over real numbers instead of a pre-baked interpretation.
Related MCP server: Observium MCP Server
Setup
uv syncRequires the rrdtool command on PATH (already present on any host
running Munin, since it's a dependency of munin-node/munin).
Configuration (environment variables)
Variable | Default | Description |
|
| Root directory of the RRD files |
|
| Location of Munin's |
|
| Transport to serve: |
|
| Bind host for |
|
| Bind port for |
| (unset — sar support disabled) | Root directory of sar logs, laid out as |
| (unset — wtmp/btmp support disabled) | Root directory of wtmp/btmp logs, laid out as |
Running
uv run rrdmcpTransport can also be selected with CLI flags, which take precedence over the environment variables above:
uv run rrdmcp --transport streamable-http --host 0.0.0.0 --port 8000MCP client configuration example
{
"mcpServers": {
"rrdmcp": {
"command": "uv",
"args": ["run", "--directory", "/path/to/rrdmcp", "rrdmcp"],
"env": {
"MUNIN_RRD_BASE_PATH": "/var/lib/munin"
}
}
}
}Running in Docker
docker build -t rrdmcp .Since this is a stdio transport, mount the directory holding the real
Munin data read-only and keep stdin open with -i:
docker run --rm -i -v /var/lib/munin:/var/lib/munin:ro rrdmcpMCP client configuration example (Docker):
{
"mcpServers": {
"rrdmcp": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/var/lib/munin:/var/lib/munin:ro",
"rrdmcp"
]
}
}
}If you mount MUNIN_RRD_BASE_PATH at a different path, add
-e MUNIN_RRD_BASE_PATH=... to docker run (the image default is
/var/lib/munin).
Tools
list_hosts— list every discovered(group, host)pairlist_plugins(group, host)— list plugins for a hostlist_fields(group, host, plugin)— list a plugin's fields (label, type, thresholds, etc.)get_metadata(group, host, plugin, field?)— detailed metadata for a whole plugin, or a single fieldfetch_series(group, host, plugin, field, start, end, resolution?, summary?, top_n?, top_by?, order?)— fetch time series data.start/endaccept a unix timestamp, an ISO 8601 timestamp (e.g.2026-09-07T12:00:00Z; naive timestamps are treated as UTC), or any stringrrdtoolunderstands (-1d,now, etc.). Fields backed by the sar data source only accept a unix timestamp or an ISO 8601 timestamp forstart/end(rrdtool-style relative expressions like-1dare munin-only).With no options, returns raw
pointsas-isresolution(seconds) aggregates into UTC-epoch-alignedbuckets(avg/min/max/count) instead of raw pointssummary=trueaggregates the whole range into a singlesummary(avg/min/max/count); cannot be combined withresolutiontop_n(requiresresolution) returns only the top N buckets sorted bytop_by("avg"/"min"/"max", default "avg") inorder("desc"/"asc", default "desc");total_bucketsreports the count before filtering, so you can ask things like "the 10 days with the highest average" or "the 5 days with the lowest minimum" directly
render_graph(group, host, plugin, fields, start, end, width?, height?)— render a PNG graph overlaying the given fieldslist_login_sources()— list every discovered(group, host, kind)triple from wtmp/btmp logs (kindis"wtmp"or"btmp")list_login_events(group, host, kind, start, end, limit?)— fetch raw login-event records for one host (no session pairing or duration computed), sorted ascending by timestamp.start/endaccept a unix timestamp or an ISO 8601 timestamp only. Iflimitis given, only the most recentlimitevents are returned;total_eventsreports the count before truncation
Known limitations
If
datafileis unavailable, discovery falls back to best-effort parsing of RRD filenames, losing precision on host/plugin boundaries and all metadataGraph rendering is a simplified version — it doesn't reproduce Munin's own threshold bands, stacking, CDEFs, etc.
sar support requires log files pre-aggregated under
SAR_BASE_PATH/<group>/<host>/saXX(e.g. viarsyncfrom each host's/var/log/sa); it does not read/var/log/sadirectly or collect data itselfsar plugin/field discovery only recognizes activities matching a fixed set of
sadf -jJSON shapes (scalar dicts, or arrays keyed by one ofcpu/disk-device/iface/filesystem/number); activities matching a recognized shape but missing fromsar_index.SAR_ACTIVITY_META/SAR_FIELD_METAshow up without a human-friendly title/label, while activities with an unrecognized shape are not discovered at allwtmp/btmp support requires log files pre-aggregated under
WTMP_BASE_PATH/<group>/<host>/{wtmp,btmp}(e.g. viarsync) and theutmpdumpcommand onPATH; it returns raw per-record events only — no login/logout session pairing, duration computation, orwtmpdb(SQLite-based) support
Available Tools
6 toolsfetch_seriesA
Fetch time series data for a single field.
start/end accept a unix timestamp or any string rrdtool understands
(e.g. "-1d", "now").
If resolution (seconds) is given, points are aggregated into
UTC-epoch-aligned buckets of that size (avg/min/max/count) instead of
returning every raw sample — use this for long time ranges to avoid
returning hundreds of raw points.
If summary is true, the whole range is aggregated into a single
avg/min/max/count instead of buckets or raw points. Cannot be combined
with resolution.
If top_n is given (requires resolution), only the N buckets with the
highest (or, with order="asc", lowest) top_by value ("avg", "min", or
"max") are returned, sorted by that value; total_buckets in the result
reports how many buckets existed before filtering.
Inputs: end (required), host (required), field (required), group (required), +7 more.
get_metadataB
Get metadata for a plugin, or a single field within it if field is given.
Inputs: host (required), group (required), plugin (required), field.
list_fieldsC
List fields for a given plugin.
Inputs: host (required), group (required), plugin (required). Returns: result
list_hostsA
List all (group, host) pairs discovered from the Munin datafile.
Inputs: no named parameters. Returns: result
list_pluginsB
List plugins for a given host.
Inputs: host (required), group (required). Returns: result
render_graphC
Render a PNG graph overlaying the given fields of a plugin.
Inputs: end (required), host (required), group (required), start (required), +4 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool targets a distinct level or aspect of the data hierarchy: hosts, plugins, fields, metadata, series data, and rendered graphs. There is no meaningful overlap between tools, and descriptions make the boundaries clear.
All tool names follow the same snake_case verb_noun pattern, with list_* for enumeration, get_/fetch_ for retrieval, and render_ for graph generation. The naming is predictable and consistent across the whole set.
With 6 tools, the set is well-scoped for a read-only RRD/Munin data access server. Each tool covers an essential operation without unnecessary redundancy or bloat.
The tool set covers the full exploration and retrieval workflow: discover hosts, list plugins, list fields, fetch metadata, fetch time series data, and render graphs. There are no significant dead ends or missing operations for the apparent purpose of reading monitoring data.
Maintenance
Related MCP Connectors
Manage uptime monitors and incidents and search logs, metrics and traces from an AI assistant.
Analytics for MCP servers. Query your tool calls, first-call success, retries and schema cost.
List datasets, schemas, run APL queries, and use prompts for exploration, anomalies, and monitoring.
Ask your app anything — revenue, errors, read-cost, growth — and get rendered charts back.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides tools to search, query, and visualize Prometheus metrics, returning results in JSON format for AI analysis.303 npm3MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language queries about device status, network traffic, sensor readings, alerts, and historical trends from Observium CE network monitoring.5MIT
- AlicenseAqualityBmaintenanceProvides read-only access to TacticalRMM remote monitoring and management instances via the MCP protocol. It enables querying agents, clients, alerts, checks, and other RMM data through natural language.225 npmAGPL 3.0
- AlicenseAqualityCmaintenanceEnables AI assistants to query Grafana datasources (Prometheus/Loki metrics and SQL databases like ClickHouse/Postgres/MySQL) and search or inspect dashboards through natural language, using read-only access to Grafana's API.6MIT