Read-only Prometheus MCP server for metrics querying, alerting, and monitoring inspection
Project description
Prometheus MCP Server
A read-only Model Context Protocol (MCP) server for Prometheus, enabling AI agents like Claude to query metrics, investigate alerts, and analyze monitoring data safely.
Features
- Read-Only Safety: All operations are read-only. No modifications to Prometheus configuration or data
- Comprehensive Query Support: Execute PromQL instant and range queries
- Metadata Discovery: List metrics, labels, and series
- Target Monitoring: View scrape targets and their health
- Alert Investigation: List active alerts and alert rules
- Configuration Inspection: View Prometheus configuration and runtime info
- Multiple Auth Methods: Support for Bearer tokens and Basic authentication
- Type-Safe: Full type hints for Python 3.12+
Installation
Using uv (Recommended)
# Clone the repository
git clone <repository-url>
cd prometheus-mcp-server
# Install with uv
uv pip install -e .
# Or install from PyPI (when published)
uv pip install prometheus-mcp-server
Using pip
pip install prometheus-mcp-server
Using pipx (for CLI usage)
pipx install prometheus-mcp-server
Quick Start
1. Set Environment Variables
# Prometheus server URL (required)
export PROM_URL="http://localhost:9090"
# Optional: Bearer token authentication
export PROM_TOKEN="your_bearer_token"
# Optional: Basic authentication
export PROM_USERNAME="admin"
export PROM_PASSWORD="secret"
# Optional: Timeout and SSL settings
export PROM_TIMEOUT="30"
export PROM_VERIFY_SSL="true"
2. Run the Server
# Using stdio transport (default, for Claude Desktop)
prometheus-mcp-server
# Using HTTP transport
prometheus-mcp-server --transport http --port 8000
# With custom Prometheus URL
prometheus-mcp-server --url https://prometheus.example.com
3. Configure with Claude Desktop
Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"prometheus": {
"command": "prometheus-mcp-server",
"env": {
"PROM_URL": "http://localhost:9090",
"PROM_TOKEN": "optional_bearer_token"
}
}
}
}
Or with uvx:
{
"mcpServers": {
"prometheus": {
"command": "uvx",
"args": ["prometheus-mcp-server"],
"env": {
"PROM_URL": "http://localhost:9090"
}
}
}
}
CLI Command Reference
The CLI provides commands that mirror all MCP tools, enabling direct testing and automation.
Installation
# Install from PyPI
pip install msrashed-prometheus-mcp-server
# Or with uv
uv tool install msrashed-prometheus-mcp-server
# Or with pipx
pipx install msrashed-prometheus-mcp-server
Connection & Info Commands
# Check connection to Prometheus
prometheus-mcp-server check --url http://localhost:9090
# Show tool/command mapping
prometheus-mcp-server info
# Show version
prometheus-mcp-server --version
Status Commands
# Health check
prometheus-mcp-server status health --url http://localhost:9090
# Readiness check
prometheus-mcp-server status ready --url http://localhost:9090
# Runtime info (version, goroutines, memory)
prometheus-mcp-server status runtime --url http://localhost:9090
# Build info (version, revision, branch, Go version)
prometheus-mcp-server status buildinfo --url http://localhost:9090
# Prometheus configuration
prometheus-mcp-server status config --url http://localhost:9090
# Runtime flags
prometheus-mcp-server status flags --url http://localhost:9090
# TSDB statistics (cardinality, series count)
prometheus-mcp-server status tsdb --url http://localhost:9090
# WAL replay status (useful after restart)
prometheus-mcp-server status walreplay --url http://localhost:9090
Query Commands
# Instant query - basic
prometheus-mcp-server query instant "up" --url http://localhost:9090
# Instant query - with aggregation
prometheus-mcp-server query instant 'sum(up) by (job)' --url http://localhost:9090
# Instant query - with rate
prometheus-mcp-server query instant 'rate(http_requests_total[5m])' --url http://localhost:9090
# Instant query - at specific time
prometheus-mcp-server query instant "up" --time now-1h --url http://localhost:9090
# Range query - last hour with 5m step
prometheus-mcp-server query range 'rate(container_cpu_usage_seconds_total[5m])' \
--start now-1h --end now --step 5m --url http://localhost:9090
# Range query - specific time range
prometheus-mcp-server query range 'avg(cpu_usage) by (instance)' \
--start now-6h --end now --step 1m --url http://localhost:9090
# Exemplars query (for tracing correlation)
prometheus-mcp-server query exemplars 'http_request_duration_seconds_bucket' \
--start now-1h --end now --url http://localhost:9090
Metadata Commands
# List all metric names
prometheus-mcp-server metadata metrics --url http://localhost:9090
# Get metric metadata (type, help text) - all metrics
prometheus-mcp-server metadata metric-info --url http://localhost:9090
# Get metadata for specific metric
prometheus-mcp-server metadata metric-info --metric up --url http://localhost:9090
# List all label names
prometheus-mcp-server metadata labels --url http://localhost:9090
# List labels with filter
prometheus-mcp-server metadata labels --match '{job="api"}' --url http://localhost:9090
# Get values for a specific label
prometheus-mcp-server metadata label-values job --url http://localhost:9090
prometheus-mcp-server metadata label-values namespace --url http://localhost:9090
# Get label values with filter
prometheus-mcp-server metadata label-values namespace --match '{cluster="prod"}' --url http://localhost:9090
# Find series matching selectors
prometheus-mcp-server metadata series --match '{job="kubelet"}' --url http://localhost:9090
prometheus-mcp-server metadata series --match '{__name__="up"}' --url http://localhost:9090
prometheus-mcp-server metadata series --match '{__name__=~"http_.*"}' --url http://localhost:9090
Targets Commands
# List all targets
prometheus-mcp-server targets list --url http://localhost:9090
# List only active targets
prometheus-mcp-server targets list --state active --url http://localhost:9090
# List only dropped targets
prometheus-mcp-server targets list --state dropped --url http://localhost:9090
# Get target metadata - all
prometheus-mcp-server targets metadata --url http://localhost:9090
# Get target metadata filtered by target
prometheus-mcp-server targets metadata --match-target '{job="api"}' --url http://localhost:9090
# Get target metadata filtered by metric
prometheus-mcp-server targets metadata --metric up --url http://localhost:9090
Alerts Commands
# List all active alerts (firing and pending)
prometheus-mcp-server alerts list --url http://localhost:9090
# List all rules
prometheus-mcp-server alerts rules --url http://localhost:9090
# List only alerting rules
prometheus-mcp-server alerts rules --type alert --url http://localhost:9090
# List only recording rules
prometheus-mcp-server alerts rules --type record --url http://localhost:9090
PromQL Utility Commands
# Format/prettify a PromQL query
prometheus-mcp-server promql format 'sum(rate(http_requests_total[5m]))by(status)' --url http://localhost:9090
# Parse and validate a PromQL query (returns AST)
prometheus-mcp-server promql parse 'rate(http_requests_total[5m])' --url http://localhost:9090
# Validate query syntax (will show error if invalid)
prometheus-mcp-server promql parse 'rate(http_requests_total[5m' --url http://localhost:9090
MCP Server Commands
# Run MCP server with stdio transport (default, for Claude Desktop)
prometheus-mcp-server run --url http://localhost:9090
# Run with HTTP transport
prometheus-mcp-server run --transport http --port 8000 --url http://localhost:9090
# Run with SSE transport
prometheus-mcp-server run --transport sse --host 0.0.0.0 --port 8080 --url http://localhost:9090
# Run with streamable HTTP transport
prometheus-mcp-server run --transport streamable-http --port 8000 --url http://localhost:9090
# Run with authentication
prometheus-mcp-server run --url https://prometheus.example.com --token YOUR_TOKEN
# Run with basic auth
prometheus-mcp-server run --url https://prometheus.example.com \
--username admin --password secret
# Run without SSL verification (not recommended for production)
prometheus-mcp-server run --url https://prometheus.example.com --no-verify-ssl
Global Options
All commands support these connection options:
--url URL Prometheus server URL (env: PROM_URL)
--token TOKEN Bearer token (env: PROM_TOKEN)
--username USER Basic auth username (env: PROM_USERNAME)
--password PASS Basic auth password (env: PROM_PASSWORD)
--timeout SECONDS Request timeout (default: 30)
--verify-ssl/--no-verify-ssl SSL verification (default: enabled)
CLI to MCP Tool Mapping
| CLI Command | MCP Tool | Description |
|---|---|---|
query instant |
query_instant |
Execute instant PromQL query |
query range |
query_range |
Execute range PromQL query |
query exemplars |
query_exemplars |
Query exemplars |
metadata metrics |
list_metrics |
List all metric names |
metadata metric-info |
get_metric_metadata |
Get metric metadata |
metadata labels |
list_labels |
List all label names |
metadata label-values |
get_label_values |
Get values for a label |
metadata series |
find_series |
Find matching time series |
targets list |
list_targets |
List scrape targets |
targets metadata |
get_targets_metadata |
Get target metadata |
alerts list |
list_alerts |
List active alerts |
alerts rules |
list_rules |
List alerting/recording rules |
status config |
get_config |
Get Prometheus configuration |
status flags |
get_flags |
Get runtime flags |
status runtime |
get_runtime_info |
Get runtime info |
status tsdb |
get_tsdb_stats |
Get TSDB statistics |
status buildinfo |
get_build_info |
Get build information |
status walreplay |
get_wal_replay_status |
Get WAL replay status |
status health |
check_health |
Check health status |
status ready |
check_readiness |
Check readiness status |
promql format |
format_query |
Format PromQL query |
promql parse |
parse_query |
Parse/validate PromQL query |
Available Tools
Query Tools
query_instant
Execute a PromQL instant query at a single point in time.
# Check which targets are up
query_instant(query="up")
# Get API server status
query_instant(query='up{job="api-server"}', time="now")
# Get current request rate
query_instant(query="rate(http_requests_total[5m])")
query_range
Execute a PromQL query over a time range.
# Get request rate over last hour
query_range(
query="rate(http_requests_total[5m])",
start="now-1h",
end="now",
step="30s"
)
# Get CPU usage by instance
query_range(
query="avg(cpu_usage) by (instance)",
start="2024-01-15T00:00:00Z",
end="2024-01-15T12:00:00Z",
step="1m"
)
query_exemplars
Query exemplars for trace correlation.
query_exemplars(
query="http_request_duration_seconds_bucket",
start="now-1h",
end="now"
)
Metadata Discovery Tools
list_metrics
List all available metrics.
# List all metrics
list_metrics()
# List HTTP-related metrics
list_metrics(match="http_.*")
# List all counter metrics
list_metrics(match=".*_total")
get_metric_metadata
Get metadata (type, help text) for metrics.
# Get metadata for a specific metric
get_metric_metadata(metric="http_requests_total")
# Get metadata for all metrics (limited to 100)
get_metric_metadata(limit=100)
list_labels
List all label names.
# List all labels
list_labels()
# List labels for specific job
list_labels(match=['{job="api"}'])
get_label_values
Get all values for a specific label.
# Get all job names
get_label_values(label="job")
# Get namespaces in prod cluster
get_label_values(
label="namespace",
match=['{cluster="prod"}']
)
find_series
Find time series matching label selectors.
# Find all series for a job
find_series(match=['{job="api"}'])
# Find all HTTP metrics in production
find_series(
match=['{__name__=~"http_.*",env="production"}'],
start="now-1h",
end="now"
)
Target & Scrape Tools
list_targets
List all scrape targets and their status.
# List all targets
list_targets()
# List only active targets
list_targets(state="active")
# List only dropped targets
list_targets(state="dropped")
get_targets_metadata
Get metadata about metrics from targets.
# Get metadata for specific target
get_targets_metadata(match_target='{job="api-server"}')
# Get metadata for specific metric
get_targets_metadata(metric="http_requests_total")
Alert Tools
list_alerts
List all active alerts (firing and pending).
list_alerts()
list_rules
List all recording and alerting rules.
# List all rules
list_rules()
# List only alerting rules
list_rules(type="alert")
# List only recording rules
list_rules(type="record")
Configuration & Status Tools
get_config
Get the current Prometheus configuration.
get_config()
get_flags
Get Prometheus runtime flags.
get_flags()
get_runtime_info
Get Prometheus runtime information.
get_runtime_info()
get_tsdb_stats
Get TSDB statistics and cardinality.
get_tsdb_stats()
check_health
Check Prometheus health status.
check_health()
check_readiness
Check if Prometheus is ready to serve queries.
check_readiness()
PromQL Query Examples
Basic Queries
# Check target health
up
# Filter by job
up{job="api-server"}
# Get metric value
http_requests_total
# Multiple label filters
http_requests_total{job="api",status="200"}
Rate Queries
# Request rate over 5 minutes
rate(http_requests_total[5m])
# Sum rate by status code
sum(rate(http_requests_total[5m])) by (status)
# Instant rate (more sensitive to spikes)
irate(cpu_seconds_total[1m])
Aggregation
# Average CPU by instance
avg(cpu_usage) by (instance)
# Total memory by namespace
sum(memory_usage) by (namespace)
# Maximum response time by endpoint
max(response_time) by (endpoint)
# Count of targets by job
count(up) by (job)
Advanced Queries
# 95th percentile response time
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# Predict disk usage in 1 hour
predict_linear(disk_usage[1h], 3600)
# Temperature change over 5 minutes
delta(cpu_temp[5m])
# Detect rate of increase
deriv(cpu_temp[5m])
Time Range Queries
# CPU usage increase over last hour vs previous hour
(avg_over_time(cpu_usage[1h]) - avg_over_time(cpu_usage[1h] offset 1h))
# Compare to last week
http_requests_total - http_requests_total offset 1w
Authentication
Bearer Token Authentication
export PROM_URL="https://prometheus.example.com"
export PROM_TOKEN="your_bearer_token"
prometheus-mcp-server
Basic Authentication
export PROM_URL="https://prometheus.example.com"
export PROM_USERNAME="admin"
export PROM_PASSWORD="secret"
prometheus-mcp-server
Kubernetes Service Account Token
# Get token from Kubernetes
TOKEN=$(kubectl get secret -n monitoring prometheus-token -o jsonpath='{.data.token}' | base64 -d)
export PROM_URL="https://prometheus.monitoring.svc.cluster.local:9090"
export PROM_TOKEN="$TOKEN"
prometheus-mcp-server
Configuration
Environment Variables
| Variable | Description | Default | Required |
|---|---|---|---|
PROM_URL |
Prometheus server URL | http://localhost:9090 |
No |
PROMETHEUS_URL |
Alternative to PROM_URL | - | No |
PROM_TOKEN |
Bearer token for auth | - | No |
PROMETHEUS_TOKEN |
Alternative to PROM_TOKEN | - | No |
PROM_USERNAME |
Username for basic auth | - | No |
PROM_PASSWORD |
Password for basic auth | - | No |
PROM_TIMEOUT |
Request timeout (seconds) | 30 |
No |
PROM_VERIFY_SSL |
Verify SSL certificates | true |
No |
Command-Line Arguments
prometheus-mcp-server \
--url https://prometheus.example.com \
--token your_bearer_token \
--timeout 60 \
--transport http \
--port 8000
Full options:
--url URL Prometheus server URL
--token TOKEN Bearer token for authentication
--username USERNAME Username for basic auth
--password PASSWORD Password for basic auth
--timeout SECONDS Request timeout in seconds (default: 30)
--no-verify-ssl Disable SSL verification (not recommended)
--transport {stdio,http,sse} Transport mechanism (default: stdio)
--host HOST Host for HTTP/SSE transport (default: 127.0.0.1)
--port PORT Port for HTTP/SSE transport (default: 8000)
Use Cases
Incident Investigation
Ask questions like:
- "What's the current CPU usage across all pods?"
- "Show me the error rate for the API service in the last hour"
- "Which targets are down right now?"
- "What alerts are currently firing?"
Performance Analysis
- "Compare request latency between now and 24 hours ago"
- "Show me the top 10 endpoints by request volume"
- "What's the memory usage trend for the worker pods?"
Capacity Planning
- "What's the 95th percentile response time over the last week?"
- "Show me the disk usage growth rate"
- "Which services have the highest cardinality?"
Alert Analysis
- "Why is the HighMemoryUsage alert firing?"
- "Show me the history of the DiskSpaceLow alert"
- "What's the current state of all alerting rules?"
Architecture
Project Structure
prometheus-mcp-server/
├── src/
│ └── prometheus_mcp_server/
│ ├── __init__.py # Package initialization
│ ├── __main__.py # CLI entry point
│ ├── server.py # FastMCP server setup
│ ├── tools/
│ │ ├── __init__.py
│ │ └── registry.py # All tool implementations
│ └── utils/
│ ├── __init__.py
│ ├── client.py # Prometheus HTTP client
│ └── helpers.py # Time parsing, formatting
├── pyproject.toml # Project configuration
├── README.md # This file
└── USER_STORIES.md # Detailed requirements
Technology Stack
- MCP Framework: FastMCP 2.0
- HTTP Client: httpx (async support)
- Python: 3.12+ with full type hints
- Authentication: Bearer token and Basic auth support
- Read-Only: No write operations allowed
Development
Setup Development Environment
# Clone repository
git clone <repository-url>
cd prometheus-mcp-server
# Install with dev dependencies using uv
uv pip install -e ".[dev]"
# Or with pip
pip install -e ".[dev]"
Run Tests
# Run all tests
pytest
# Run with coverage
pytest --cov=prometheus_mcp_server
# Run specific test file
pytest tests/test_client.py
Code Quality
# Format code
ruff format .
# Lint code
ruff check .
# Fix linting issues
ruff check --fix .
# Type checking (if using mypy)
mypy src/
Testing with Local Prometheus
# Run Prometheus locally with Docker
docker run -d -p 9090:9090 prom/prometheus
# Test the MCP server
export PROM_URL="http://localhost:9090"
prometheus-mcp-server
Security
Read-Only Guarantee
This MCP server is designed to be strictly read-only:
- Only GET requests and specific read-only POST endpoints are allowed
- All write operations (PUT, DELETE, PATCH) are blocked
- No configuration modifications possible
- No data deletion or manipulation
Blocked Operations
The following operations are blocked by design:
- Creating or deleting targets
- Modifying alert rules
- Changing Prometheus configuration
- Deleting time series data
- Administrative operations
Safe Endpoints Only
Only these endpoint patterns are allowed:
GET /api/v1/*- All read operationsPOST /api/v1/query*- Query operations onlyPOST /api/v1/series- Series discovery onlyPOST /api/v1/labels- Label queries onlyGET /-/healthy- Health checksGET /-/ready- Readiness checks
Troubleshooting
Connection Issues
# Test Prometheus connectivity
curl -s http://localhost:9090/api/v1/query?query=up
# Check with authentication
curl -H "Authorization: Bearer $PROM_TOKEN" \
https://prometheus.example.com/api/v1/query?query=up
SSL Certificate Issues
# Disable SSL verification (not recommended for production)
export PROM_VERIFY_SSL="false"
prometheus-mcp-server
# Or use command-line flag
prometheus-mcp-server --no-verify-ssl
Timeout Issues
# Increase timeout for slow queries
export PROM_TIMEOUT="60"
prometheus-mcp-server
# Or use command-line flag
prometheus-mcp-server --timeout 60
Debug Mode
Enable debug logging:
# Set log level
export LOG_LEVEL="DEBUG"
prometheus-mcp-server
Examples
Example Configuration Files
Claude Desktop Config (macOS)
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"prometheus-local": {
"command": "prometheus-mcp-server",
"env": {
"PROM_URL": "http://localhost:9090"
}
},
"prometheus-prod": {
"command": "prometheus-mcp-server",
"env": {
"PROM_URL": "https://prometheus.prod.example.com",
"PROM_TOKEN": "prod_bearer_token",
"PROM_TIMEOUT": "60"
}
}
}
}
Linux Config
~/.config/Claude/claude_desktop_config.json:
{
"mcpServers": {
"prometheus": {
"command": "/home/user/.local/bin/prometheus-mcp-server",
"env": {
"PROM_URL": "http://localhost:9090"
}
}
}
}
Example Queries
Investigate High Memory Alert
User: "The HighMemoryUsage alert is firing. Help me investigate."
AI uses:
1. list_alerts() - See all active alerts
2. query_instant(query='container_memory_usage{job="api"}') - Check current usage
3. query_range(query='container_memory_usage{job="api"}', start="now-6h", end="now") - See trend
4. list_rules(type="alert") - Check alert threshold
Find Top CPU Consumers
User: "Which pods are using the most CPU?"
AI uses:
1. query_instant(query='topk(10, rate(container_cpu_usage_seconds_total[5m]))') - Top 10 CPU users
2. get_label_values(label="pod") - List all pods
3. query_range(...) - Check trend over time
Check Service Health
User: "Is the API service healthy?"
AI uses:
1. query_instant(query='up{job="api-server"}') - Check if targets are up
2. list_targets(state="active") - See all active targets
3. query_instant(query='rate(http_requests_total{job="api",status=~"5.."}[5m])') - Check error rate
4. list_alerts() - Check for any alerts
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Ensure code passes
ruffchecks - Submit a pull request
License
MIT License - see LICENSE file for details
Support
- Issues: GitHub Issues
- Prometheus Docs: https://prometheus.io/docs/
- PromQL Guide: https://prometheus.io/docs/prometheus/latest/querying/basics/
- MCP Documentation: https://modelcontextprotocol.io/
Related Projects
- Datadog MCP Server - MCP server for Datadog
- Grafana MCP Server - MCP server for Grafana
Acknowledgments
- Built with FastMCP
- Follows Model Context Protocol specification
- Inspired by the Prometheus community's excellent API design
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file msrashed_prometheus_mcp_server-0.2.2.tar.gz.
File metadata
- Download URL: msrashed_prometheus_mcp_server-0.2.2.tar.gz
- Upload date:
- Size: 110.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2a51062af0548a9f0a03417f622e4754c8f0917afbcea9e12940f5b27f05e41
|
|
| MD5 |
0d513d128ec4e5086dd6e37257968c60
|
|
| BLAKE2b-256 |
f3e4e4656e304812ca1a0826fa2f2b409c184244de3cc6f1a3b477787c665502
|
File details
Details for the file msrashed_prometheus_mcp_server-0.2.2-py3-none-any.whl.
File metadata
- Download URL: msrashed_prometheus_mcp_server-0.2.2-py3-none-any.whl
- Upload date:
- Size: 36.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd7f3dee4314173c7b0fde532c5a42e45fe01606cd12a9a0d4712b6ff76f5759
|
|
| MD5 |
db8f734ecc67be5c0de478989d104555
|
|
| BLAKE2b-256 |
912c6520c8bb300f816cd65759b52e2a287e0e76665033e571bcc0fd9883a4a7
|