Prometheus MCP vs ProjectPulse MCP
A side-by-side look at the Prometheus MCP and ProjectPulse MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Prometheus MCP for monitoring work as a local process; choose ProjectPulse MCP for monitoring as a local process. You can also run both side by side in one mcpServers block.
Which MCP server should you choose?
Choose Prometheus MCP when
- You need dedicated capabilities in the Monitoring domain.
- You prefer a local stdio subprocess transport.
- You have the keys it needs:
PROMETHEUS_URL, PROMETHEUS_TOKEN, PROMETHEUS_USERNAME, PROMETHEUS_PASSWORD, PROMETHEUS_SSL_VERIFY. - You want tools like
prometheus_list_metrics, prometheus_query, prometheus_query_range.
Choose ProjectPulse MCP when
- You need dedicated capabilities in the Monitoring domain.
- You prefer a local stdio subprocess transport.
- You have the keys it needs:
GITHUB_TOKEN. - You want tools like
check_ci_status, get_repo_health, analyze_dependencies.
Feature & specification comparison
Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Monitoring | Monitoring |
| Quality signal | 56/100 · Good | 64/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Free |
| Required env vars | PROMETHEUS_URLPROMETHEUS_TOKENPROMETHEUS_USERNAMEPROMETHEUS_PASSWORDPROMETHEUS_SSL_VERIFY | GITHUB_TOKEN |
| Verified owner | Community listing | Community listing |
| GitHub stars | 0 | 1 |
| Directory activity | 5 views 0 installs 0 upvotes | 4 views 0 installs 0 upvotes |
| Tools | 21 | 8 |
| Full listing | View Prometheus MCP | View ProjectPulse MCP |
Tools & capabilities
Prometheus MCP tools 21
prometheus_list_metricsList all metric names known to Prometheus, with optional substring filter. Wraps ``GET /api/v1/label/__name__/values``. Prometheus returns all metric names at once — no pagination. Output is capped at 500 metrics after filtering, with a truncation hint when more exist. Use this first to discover valid metric names before writing PromQL expressions for ``prometheus_query`` or ``prometheus_query_range``. Examples: - Use when: "What metrics does Prometheus have about HTTP requests?" → ``pattern='http'``; read the ``metrics`` list. - Use when: "List all node_exporter metrics" → ``pattern='node_'``. - Use when: Starting a monitoring investigation — list metrics first to discover what's instrumented, then query specific ones. - Don't use when: You already know the exact metric name and want to query its value (call ``prometheus_query`` directly — one fewer round trip). - Don't use when: You want to see current alert state (call ``prometheus_list_alerts``). Returns: dict with ``total_count`` / ``returned_count`` / ``truncated`` / ``pattern`` / ``metrics`` (sorted list).prometheus_queryExecute an instant PromQL query against Prometheus. Wraps ``GET /api/v1/query``. Returns the result type (vector, scalar, matrix, string) and a list of samples each carrying labels, timestamp, and value. For ``vector`` results each element is one time series at the evaluation instant. Examples: - Use when: "Is the payment service up right now?" → ``query='up{job="payment-service"}'``. - Use when: "What is the current HTTP request rate?" → ``query='sum(rate(http_requests_total[5m])) by (job)'``. - Use when: "Show me all metrics for a specific instance" → ``query='{instance="localhost:9090"}'``. - Don't use when: You want to see how a metric changed over time (call ``prometheus_query_range`` with start/end/step). - Don't use when: You don't know the metric name yet (call ``prometheus_list_metrics`` first to discover names). Returns: dict with ``query`` / ``time`` / ``result_type`` / ``result_count`` / ``data`` (list of samples with ``labels``, ``timestamp``, ``value``).prometheus_query_rangeExecute a PromQL range query returning time-series data points. Wraps ``GET /api/v1/query_range``. Returns one series per matching time series, each with labels and a list of ``[timestamp, value]`` pairs. Total points across all series are capped at 5000 with a truncation hint. Prometheus may reject the query with HTTP 422 (bad_data) if the step produces too many data points (> 11,000 per series). Increase the step or narrow the time range if this happens. Note: The Prometheus API does not support filtering by branch or commit in this endpoint — filters are expressed purely in PromQL label matchers. Examples: - Use when: "Show me CPU usage over the last hour with 1-minute resolution" → ``query='rate(node_cpu_seconds_total[5m])'``, ``step='1m'``. - Use when: "Graph HTTP error rate for the last 24 hours" → ``query='rate(http_requests_total{status=~"5.."}[5m])'``, ``start='2024-01-15T00:00:00Z'``, ``end='2024-01-16T00:00:00Z'``, ``step='5m'``. - Use when: Investigating a past incident — pick the time window of the incident and use a fine step. - Don't use when: You only want the current value (call ``prometheus_query`` — faster and simpler). - Don't use when: You want alert history (call ``prometheus_list_alerts``). Returns: dict with ``query`` / ``start`` / ``end`` / ``step`` / ``result_type`` / ``series_count`` / ``total_points`` / ``truncated`` / ``data`` (list of series with ``labels``, ``point_count``, ``values``).prometheus_list_alertsList all active and pending alerts from Prometheus. Wraps ``GET /api/v1/alerts``. Returns every alert that Prometheus currently tracks, with labels (including ``alertname``, ``severity``), state (``firing`` / ``pending``), the time it became active, and its current value. Also returns a summary grouped by state and a count by severity label. Examples: - Use when: "Are there any firing alerts right now?" → check ``firing_count`` and ``alerts`` where ``state='firing'``. - Use when: "Show me all critical alerts" → filter ``alerts`` by ``labels.severity == 'critical'``. - Use when: Checking system health during an incident — list alerts first to understand what's firing before querying metrics. - Don't use when: You want historical alert data (Prometheus stores only current state; use Alertmanager or a recording rule for history). - Don't use when: You want raw metric values (call ``prometheus_query`` or ``prometheus_query_range``). Returns: dict with ``total_count`` / ``firing_count`` / ``pending_count`` / ``state_summary`` / ``alerts`` (list with ``labels``, ``annotations``, ``state``, ``active_at``, ``value``). Enhanced with correlation information when requested.prometheus_list_targetsList Prometheus scrape targets, summarised by job and health. Wraps ``GET /api/v1/targets``. Returns scrape targets with job name, instance address, health status (``up`` / ``down`` / ``unknown``), last scrape duration in milliseconds, and any last error. Also returns a summary grouped by job and health state. Examples: - Use when: "Which targets are currently down?" → filter ``targets`` where ``health='down'`` and check ``last_error``. - Use when: "How many instances of the 'node-exporter' job are up?" → check ``job_summary`` for the 'node-exporter' entry. - Use when: Investigating a scrape failure — list targets for the affected job to see which instances have errors. - Don't use when: You want metric values from a target (call ``prometheus_query`` with label matchers instead). - Don't use when: You want alert status (call ``prometheus_list_alerts`` instead). Returns: dict with ``state_filter`` / ``total_count`` / ``up_count`` / ``down_count`` / ``unknown_count`` / ``job_summary`` (per-job health counts) / ``targets`` (list with ``job``, ``instance``, ``health``, ``last_scrape_duration_ms``, ``last_error``, ``labels``).prometheus_get_metric_metadataGet metric metadata (HELP text, TYPE, UNIT) from Prometheus. Wraps ``GET /api/v1/metadata``. Returns the metadata that Prometheus scraped from ``HELP``, ``TYPE``, and ``UNIT`` lines in the exposition format. Each metric may have multiple metadata entries if different scrape targets expose different help strings. Use this to understand what a metric measures, its type (counter, gauge, histogram, summary), and unit — essential for writing correct PromQL. For example, knowing a metric is a counter means you should use ``rate()`` or ``increase()``; a gauge can be used directly. Examples: - Use when: "What does http_requests_total measure?" → ``metric='http_requests_total'``; read ``help`` and ``type``. - Use when: "Show me all histogram metrics" → call with no filter; filter results where ``type='histogram'``. - Use when: Starting an investigation — check metric types before writing PromQL to avoid using rate() on a gauge. - Don't use when: You already know the metric type and want to query values (call ``prometheus_query`` directly). Returns: dict with ``metric`` / ``total_count`` / ``returned_count`` / ``truncated`` / ``metadata`` (dict of metric name → list of ``{type, help, unit}``).prometheus_list_label_valuesList all values for a specific label from Prometheus. Wraps ``GET /api/v1/label/{label_name}/values``. Returns all distinct values for the named label across all time series, optionally filtered by a series selector. Use this to discover what entities exist for a given label dimension — for example, which jobs are running, which instances are scraped, or which namespaces have metrics. This is essential for building targeted PromQL queries during investigation. Examples: - Use when: "What jobs does Prometheus scrape?" → ``label='job'``; read the ``values`` list. - Use when: "What instances are in the 'node-exporter' job?" → ``label='instance'``, ``match='{job="node-exporter"}'``. - Use when: "What namespaces have metrics?" → ``label='namespace'``. - Don't use when: You want metric names (call ``prometheus_list_metrics`` — has substring filtering). - Don't use when: You want current metric values (call ``prometheus_query`` with a PromQL expression). Returns: dict with ``label`` / ``match`` / ``total_count`` / ``returned_count`` / ``truncated`` / ``values`` (sorted list).prometheus_list_rulesList recording and alerting rules from Prometheus. Wraps ``GET /api/v1/rules``. Returns rule groups with their rules, including the PromQL expression, rule type (recording or alerting), and for alerting rules their current state (firing/pending/inactive). Use this to understand the alerting configuration, find recording rules that pre-compute useful aggregations, and investigate which rules are currently firing or have health issues. Examples: - Use when: "What alerting rules are configured?" → ``type='alert'``; inspect rule names and expressions. - Use when: "Are there any recording rules I can use instead of computing aggregations from scratch?" → ``type='record'``; look for rules matching your investigation. - Use when: "Why is this alert firing? What's its PromQL expression?" → call with no filter; find the alert by name; read its ``query``. - Don't use when: You want to see which alerts are currently firing (call ``prometheus_list_alerts`` — shows active alerts with state and value, without the PromQL definition). Returns: dict with ``type_filter`` / ``total_groups`` / ``total_rules`` / ``recording_count`` / ``alerting_count`` / ``groups`` (list of rule groups with ``name``, ``file``, ``rule_count``, ``rules``).alertmanager_list_silencesList all silences from Alertmanager. Wraps ``GET /api/v2/silences``. Returns silences with matchers, status (active/pending/expired), creator, comment, and time bounds. Use this to understand which alerts are currently silenced and why. During incident handoffs, knowing what's silenced is critical — a silenced alert is invisible in Prometheus ``/alerts``. Examples: - Use when: "Is the HighCPU alert silenced?" → search silences for matching matchers. - Use when: "Who silenced alerts for the payment service?" → check ``createdBy`` and ``comment``. - Don't use when: You want active firing alerts (call ``alertmanager_list_alerts``). Returns: dict with ``total_count`` / ``active_count`` / ``pending_count`` / ``expired_count`` / ``silences`` (list with matchers, status, etc.).alertmanager_list_alertsList alerts from Alertmanager with suppression state. Wraps ``GET /api/v2/alerts``. Returns alerts with their status (active/suppressed/unprocessed), silence IDs, and inhibition IDs. Unlike ``prometheus_list_alerts``, this shows WHY an alert is or isn't firing — suppressed alerts include ``silencedBy`` and ``inhibitedBy`` arrays. Examples: - Use when: "Why isn't the HighCPU alert firing?" → check if it's suppressed (silencedBy or inhibitedBy). - Use when: "Show all suppressed alerts" → filter by ``status.state == 'suppressed'``. - Don't use when: You want Prometheus-side alert state (call ``prometheus_list_alerts``). Returns: dict with ``total_count`` / ``active_count`` / ``suppressed_count`` / ``unprocessed_count`` / ``alerts`` (list with status, silencedBy, etc.).alertmanager_get_statusGet Alertmanager cluster status, version, and config. Wraps ``GET /api/v2/status``. Returns cluster state (ready/settling), version info, uptime, and the raw configuration YAML. Examples: - Use when: "Is Alertmanager healthy?" → check ``cluster_status``. - Use when: "What version of Alertmanager is running?" → check ``version_info``. - Don't use when: You want to see active alerts (call ``alertmanager_list_alerts``). Returns: dict with ``cluster_status`` / ``version_info`` / ``uptime`` / ``config_yaml``.alertmanager_list_alert_groupsList alert groups from Alertmanager showing routing topology. Wraps ``GET /api/v2/alerts/groups``. Returns groups with their labels, receiver, and alert count — shows how alerts are grouped for notification. Examples: - Use when: "Why did I get one notification instead of many?" → check which alerts are in the same group. - Use when: "What receiver handles payment alerts?" → find the group and check its receiver. - Don't use when: You want individual alert details (call ``alertmanager_list_alerts``). Returns: dict with ``total_groups`` / ``total_alerts`` / ``groups`` (list with ``labels``, ``receiver``, ``alert_count``).- +9 more on the listing page
ProjectPulse MCP tools 8
check_ci_statusFetches recent CI/CD workflow runs (GitHub Actions) for a GitHub repository. - Side effects: None. This is a strictly read-only operation. - Data sources: GitHub REST API (actions/runs). - Auth requirements: No authentication required for public repositories. Uses configured token if available. - Rate limits: Subject to standard GitHub API limits. - Return shape: Returns a JSON array of workflow runs including name, status, conclusion, head_branch, created_at, updated_at, and html_url. - Usage guidelines: Use this tool ONLY to check raw GitHub Actions workflow history and CI build statuses. DO NOT use this tool for other analyses: - For a computed A-F health score grading, use 'get_health_score' instead. - For retrieving basic repository stats (stars, forks), use 'get_repo_health' instead. - For calculated DORA metrics, use 'get_dora_metrics' instead.get_repo_healthFetches basic repository metadata and statistics from the public GitHub API. - Side effects: None. This is a strictly read-only operation. - Data sources: Public GitHub REST API (GET /repos/{owner}/{repo}). - Auth requirements: No authentication required for public repositories. Uses configured GitHub token if available. - Rate limits: Subject to standard GitHub API limits (60 requests/hour unauthenticated, 5000 requests/hour authenticated). - Return shape: Returns a JSON object containing specific metadata: full_name (string), description (string), stargazers_count (number), open_issues_count (number), language (string), license (string, SPDX ID), pushed_at (ISO 8601 string), default_branch (string), archived (boolean), and forks_count (number). - Usage guidelines: Use this tool ONLY to retrieve basic raw metadata (like stars, forks, language, and issue counts). DO NOT use this tool for other specific analyses: - For a computed A-F health score grading, use 'get_health_score' instead. - For checking CI/CD workflow run statuses, use 'check_ci_status' instead. - For package vulnerabilities and dependency graph, use 'analyze_dependencies' instead. - For code security and static analysis, use 'analyze_code_scanning' instead.analyze_dependenciesFetches Dependabot alerts for a GitHub repository to analyze vulnerable package dependencies. - Side effects: None. This is a strictly read-only operation. - Data sources: GitHub REST API (dependabot/alerts). - Auth requirements: Requires GITHUB_TOKEN with appropriate permissions (dependabot alerts are often restricted). - Rate limits: Subject to standard GitHub API limits. - Return shape: Returns a JSON array of vulnerable package dependencies including summary, severity, package_name, state, and html_url. - Usage guidelines: Use this tool ONLY to find vulnerable package dependencies (npm, pip, etc.). DO NOT use this tool for other checks: - For static code security vulnerabilities (CodeQL), use 'analyze_code_scanning' instead. - For a computed A-F health score grading, use 'get_health_score' instead.analyze_code_scanningFetches or triggers open Code Scanning (CodeQL) alerts for a GitHub repository. - Side effects: Read-only by default. If trigger_scan=true, writes to GitHub Actions by creating a workflow_dispatch event. - Data sources: GitHub REST API (code-scanning/alerts and actions). - Auth requirements: Requires GITHUB_TOKEN with appropriate permissions (security-events). - Rate limits: Subject to standard GitHub API limits. - Return shape: Returns a JSON array of alert objects including rule_id, severity, rule_description, state, location paths, and html_url. - Usage guidelines: Use this tool ONLY for deep static code vulnerability scanning (CodeQL). DO NOT use this tool for other checks: - For package/dependency vulnerabilities, use 'analyze_dependencies' instead. - For a computed A-F health score grading, use 'get_health_score' instead. - For checking standard CI/CD workflow statuses, use 'check_ci_status' instead.get_health_scoreCalculates a 0-100 health score and A-F grade for a GitHub repository. - Side effects: Writes a trend snapshot to local disk for history tracking. Read-only against GitHub API. - Data sources: GitHub REST API (repos, actions, dependabot) and OpenSSF Scorecard API. - Auth requirements: No authentication required for public repositories. Uses configured token if available. - Rate limits: Subject to standard GitHub API limits (heavy usage across multiple endpoints). - Return shape: Returns a JSON object with a grade (A-F), total score, detailed category breakdown (CI, freshness, security, community, maintenance), improvement suggestions, and historical trend data. - Usage guidelines: Use this tool ONLY for deep analytical grading and overall repository health assessment. DO NOT use this tool for quick metadata checks: - For basic raw metadata (stars, language, etc.), use 'get_repo_health' instead. - For raw CI workflow statuses, use 'check_ci_status' instead. - For deep code vulnerability scanning, use 'analyze_code_scanning' instead. - For DORA metrics, use 'get_dora_metrics' instead.get_dora_metricsCalculates DORA proxy metrics (deployment frequency, lead time, change failure rate, MTTR) for a GitHub repository. - Side effects: None. This is a strictly read-only operation. - Data sources: GitHub REST API (releases, actions/runs, pulls). - Auth requirements: No special authentication required for public repositories. Private repositories require GITHUB_TOKEN. - Rate limits: Subject to standard GitHub API limits. Heavy API usage due to multiple list endpoints being queried. - Return shape: Returns a JSON object with calculated DORA metrics over the specified period. - Usage guidelines: Use this tool ONLY to evaluate DORA metrics and team delivery performance. DO NOT use this tool for other checks: - For raw workflow statuses, use 'check_ci_status' instead. - For a computed A-F health score grading, use 'get_health_score' instead. - For general repository metadata, use 'get_repo_health' instead.compare_reposCompares health scores of multiple GitHub repositories (2-5 repos) and ranks them. - Side effects: None. This is a strictly read-only operation. - Data sources: GitHub REST API and OpenSSF Scorecard API (via get_health_score logic). - Auth requirements: No authentication required for public repositories. Uses configured token if available. - Rate limits: Subject to standard GitHub API limits. Multiplies API calls by the number of repositories compared. - Return shape: Returns a JSON object containing a ranked list of repositories (owner, repo, rank) with their detailed health breakdown (score, CI, freshness, security, community, maintenance). - Usage guidelines: Use this tool ONLY when you need to compare or rank multiple repositories against each other based on their health scores. DO NOT use this tool for analyzing a single repository: - For getting the health score of a single repository, use 'get_health_score' instead. - For comparing raw metadata instead of health scores, query 'get_repo_health' individually.check_best_practicesChecks whether a GitHub repository follows open-source community best practices. - Evaluates 12 checks: README, LICENSE, SECURITY.md, CONTRIBUTING.md, CODE_OF_CONDUCT, issue/PR templates, branch protection, Dependabot, CI/CD, description, and topics. - Returns a weighted 0-100 score with A-F grade, per-check pass/fail/unknown status, and actionable suggestions for missing items. - Side effects: None. Read-only operation. - Rate limits: ~6 GitHub API calls per invocation. - Branch protection check requires admin access — returns "unknown" (not penalized) if token lacks permission. - Use this tool to audit repo quality and discoverability. For a computed health grade based on CI/security/activity, use 'get_health_score' instead.
Ready-to-paste client configs
Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
Prometheus MCP
{
"mcpServers": {
"prometheus-mcp": {
"command": "uvx",
"args": [
"prometheus-mcp"
],
"env": {
"PROMETHEUS_URL": "YOUR_PROMETHEUS_URL_HERE",
"PROMETHEUS_TOKEN": "YOUR_PROMETHEUS_TOKEN_HERE",
"PROMETHEUS_USERNAME": "YOUR_PROMETHEUS_USERNAME_HERE",
"PROMETHEUS_PASSWORD": "YOUR_PROMETHEUS_PASSWORD_HERE",
"PROMETHEUS_SSL_VERIFY": "YOUR_PROMETHEUS_SSL_VERIFY_HERE"
}
}
}
}
ProjectPulse MCP
{
"mcpServers": {
"projectpulse-mcp": {
"command": "npx",
"args": [
"-y",
"projectpulse-mcp"
],
"env": {
"GITHUB_TOKEN": "YOUR_GITHUB_TOKEN_HERE"
}
}
}
}
Frequently asked questions
Prometheus MCP is categorized under Monitoring and uses a local stdio subprocess. ProjectPulse MCP belongs to Monitoring and uses a local stdio subprocess. Pick Prometheus MCP for monitoring work and ProjectPulse MCP for monitoring.
Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.
Prometheus MCP has no declared pricing — check the project's own site. ProjectPulse MCP is listed as free. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.
Yes. MCP clients support multiple servers: add prometheus-mcp and projectpulse-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.
On AllMCPs, Prometheus MCP has a quality signal of 56/100 (Good) with 5 views, 0 installs and 0 GitHub stars. ProjectPulse MCP has 64/100 (Good) with 4 views, 0 installs and 1 GitHub stars.