BuildPulse

io.github.BuildPulseLLCPublished by GitHub account BuildPulseLLCv0.2.0Updated Nov 7, 2026

BuildPulse for AI agents: CI runner usage, cost and savings, plus flaky tests, failures, coverage.

VerifiedStreamable HTTPWeb executableCloud & InfrastructureDeveloper ToolsData & Analytics

Overview

AI-generated overview

BuildPulse MCP server that lets an assistant read CI runner usage, cost and savings, and investigate flaky tests, failures, CI runs and coverage.

What you can do
  • Check runner status, usage, cost, savings and available runner labels for an organization
  • List organizations and the repositories BuildPulse monitors
  • Search a repository's flaky tests and pull recent disruption events for a single test
  • List recent CI submissions and the per-test results of one run, or aggregate recent failures
  • Report a repository's current flakiness percentage and coverage percentage
When to use it
Useful when a team already sends CI test results to BuildPulse and wants an assistant to triage flaky tests, explain why a build is red, or report coverage and flakiness. Also handy for checking whether an organization is on BuildPulse runners and what they cost or save.
Requirements
Either the hosted remote endpoint with OAuth sign-in through a BuildPulse account, or a local process via the npm package, which downloads a native binary for macOS, Linux or Windows. The local path needs a BuildPulse API token in BUILDPULSE_TOKEN, or an Authorization bearer header against the hosted URL. A paid plan with API access may be required.
Before you install
The API token grants access to the same organizations as your account, so treat it as a secret. Multi-organization accounts must pass an organization_id on every scoped call or the call errors. Tools are read-only, but results expose repository, test and build data to the assistant and its model provider. Some calls fail with plan_required when the plan lacks API access.

Installation

In SourceWeft

  1. Open BuildPulse in the dashboard and add it to a workspace.
  2. Connect the required credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.BuildPulseLLC%2Fbuildpulse-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.

{
  "mcpServers": {
    "buildpulse": {
      "type": "http",
      "url": "https://mcp.buildpulse.io/mcp"
    }
  }
}

README

[buildpulse-mcp, by BuildPulse]

[Runs on BuildPulse]

Model Context Protocol server for BuildPulse: faster, cheaper CI runners for GitHub Actions, CircleCI and Semaphore, with Test Intelligence built in. Read runner usage, cost and savings, find out whether an organization is on BuildPulse runners yet, and surface flaky tests, CI run history, failures and coverage in Claude, Cursor, ChatGPT, Cline, Windsurf, Continue, Zed, VS Code Copilot, and any other MCP-aware AI agent.

BuildPulse runners finish jobs about twice as fast at half the cost of the provider's hosted runners ($0.004 a minute on x64 2 vCPU). Every organization gets 3,000 free minutes a month, no card required, and Test Intelligence (flaky-test detection, coverage, CI metrics) is included with every minute. An organization that has not activated runners can be pointed at https://buildpulse.io/organizations/{orgId}/runners/setup; the estimate_runner_savings prompt works out what they would save.

[npm version] [npm downloads] [License: MIT] [MCP Registry] [Install on Smithery] [Docs]

Quickstart

Hosted (recommended) — nothing to install, no API token. Your client opens a browser and you sign in with your BuildPulse account (Google, GitHub, Bitbucket, Apple, or email):

bash
claude mcp add --transport http buildpulse https://mcp.buildpulse.io/mcp

Claude.ai, ChatGPT, Cursor, VS Code: add https://mcp.buildpulse.io/mcp as an HTTP/remote MCP server and complete the sign-in when prompted.

Local stdio — for clients that only spawn a process, or for scripts and CI where a browser sign-in is not possible. This path needs an API token:

bash
BUILDPULSE_TOKEN=bp_... npx -y @buildpulse/mcp

See Authentication for where tokens come from and when you need one.

Try asking

  • "Are we on BuildPulse runners yet? What would they save us?"
  • "What did our runners cost last month, and how does that compare to GitHub list price?"
  • "Which BuildPulse runner labels can I use in this workflow?"
  • "Why is CI red on web-client? Show me the failing tests from the last run."
  • "Which tests in platform-api have been flakiest this week, and where do they fail?"
  • "How well tested is agents? Give me flakiness and coverage."
  • "Which tests failed in more than one of the last 10 runs of api?"
  • "Triage the flaky tests in frontend and tell me which to quarantine first."

Install

bash
npx -y @buildpulse/mcp

Or pin globally:

bash
npm install -g @buildpulse/mcp

The package downloads the matching native binary for your platform on first install. Supported platforms: macOS arm64/x64, Linux arm64/x64, Windows x64.

Authentication

There are two ways to authenticate, and most people only need the first.

How you sign inNeeds an API token?Use it for
Hosted SSO (https://mcp.buildpulse.io/mcp)OAuth 2.1: your client opens the BuildPulse login (Google, GitHub, Bitbucket, Apple, or email) and stores a session for youNoClaude Code, Claude.ai, ChatGPT, Cursor, VS Code, and any client that supports remote MCP servers with OAuth
API tokenBUILDPULSE_TOKEN=bp_... for stdio, or an Authorization: Bearer bp_... header against the hosted URLYesLocal npx stdio, clients without OAuth support, scripts and CI

Get a token at https://buildpulse.io → Organization Settings → API Tokens. Tokens look like bp_<64 hex chars>; the older 40-character hex tokens still work. A token grants access to the same organizations your account does.

Configure

Hosted snippets sign you in via SSO. Stdio snippets need BUILDPULSE_TOKEN; replace bp_... with your token.

Claude Code

Hosted (SSO, no token):

bash
claude mcp add --transport http buildpulse https://mcp.buildpulse.io/mcp

Stdio (token):

bash
claude mcp add buildpulse -e BUILDPULSE_TOKEN=bp_... -- npx -y @buildpulse/mcp

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "buildpulse": {      "command": "npx",      "args": ["-y", "@buildpulse/mcp"],      "env": { "BUILDPULSE_TOKEN": "bp_..." }    }  }}

Cursor

.cursor/mcp.json (per-project) or ~/.cursor/mcp.json (global). Hosted with SSO (Cursor prompts you to sign in the first time):

json
{  "mcpServers": {    "buildpulse": {      "url": "https://mcp.buildpulse.io/mcp"    }  }}

To use a token instead of signing in, add "headers": { "Authorization": "Bearer bp_..." }. For stdio, use the command / args / env shape from the Claude Desktop snippet.

VS Code (GitHub Copilot agent mode)

.vscode/mcp.json. Hosted with SSO (VS Code opens the sign-in when the server first starts):

json
{  "servers": {    "buildpulse": {      "type": "http",      "url": "https://mcp.buildpulse.io/mcp"    }  }}

To use a token instead, add "headers": { "Authorization": "Bearer bp_..." }. For stdio, use "type": "stdio" with the command / args / env fields from the Claude Desktop snippet.

Windsurf

~/.codeium/windsurf/mcp_config.json — same mcpServers block as Claude Desktop.

Cline

Cline → MCP Servers → Configure → paste the same mcpServers block into cline_mcp_settings.json.

ChatGPT

ChatGPT → Settings → Connectors → Create → URL https://mcp.buildpulse.io/mcp. ChatGPT completes the SSO sign-in; no token to paste.

Claude.ai

Settings → Connectors → Add custom connector → URL https://mcp.buildpulse.io/mcp. Sign in when prompted; no token.

Other clients

Continue, Zed, and anything else MCP-aware takes the same command / args / env fields. See the install hub for copy-paste snippets per client.

Organizations (multi-tenant)

Your BuildPulse token may grant access to more than one organization. Every repo-scoped tool takes an optional organization_id argument (the org's id UUID, discoverable via list_my_organizations):

  • Single-org tokens — omit organization_id. It auto-defaults to your one organization. Nothing changes; you never need to think about orgs.
  • Multi-org sessions (list_my_organizations returns 2+ orgs) — you must pass organization_id on every org- or repo-scoped call (get_runner_status, get_runner_usage, get_runner_configs, list_repositories, find_flaky_tests, get_test_history, list_recent_submissions, get_submission_test_results, get_recent_failures, get_repo_flakiness, get_repo_coverage). The org is not auto-selected — omitting it returns an error that lists every accessible organization and its UUID, so the agent can pick the right one and retry. Call list_my_organizations first to enumerate them.

This avoids silently querying the wrong (often empty) organization and getting confusingly empty results.

Tools

ToolPurpose
get_runner_statusWhether the organization has activated BuildPulse runners, its billing mode, and when it has not, how_to_start (3,000 free minutes a month) with the setup URL.
get_runner_usageRunner jobs, billable minutes, cost before and after free minutes, p50/p90 job duration, queue wait, and the same minutes at GitHub list price with savings_percent, per size and provider; days 1-90 (default 30). The pricing block carries the rate card.
get_runner_configsThe runner sizes and runs-on labels (or CircleCI resource class / Semaphore agent type) the organization has configured.
list_my_organizationsEnumerate the organizations this token can access; get the id (UUID) to pass as organization_id.
list_repositoriesList repositories in an organization.
find_flaky_testsSearch a repository's flaky test inventory; filter by tags, recency, free-text.
get_test_historyRecent disruption events for a specific test.
list_recent_submissionsRecent test-result submissions (CI runs) for a repository.
get_submission_test_resultsPer-test results for one submission (one CI run).
get_recent_failuresTests that failed across the most recent submissions, aggregated by test identity.
get_repo_flakinessCurrent flakiness % over the last 14 days. -1 means no recent results.
get_repo_coverageCurrent coverage % from the latest uploaded report. -1 means no report.

Runner tools are organization-scoped (no repository argument). Every org- or repo-scoped tool accepts an organization_id argument, required for multi-org sessions and optional (auto-defaulted) for single-org tokens. See Organizations above.

Every output that names a test or repo includes a web_url deep-link back to the BuildPulse web app — the same polish Sentry / Atlassian use in their MCP responses.

Prompts

The server also ships five guided prompts (slash-pickable in clients that support them):

  • /estimate_runner_savings: fetches runner status; with no tenant, estimates CI minutes from recent runs and prices them at BuildPulse versus GitHub list rate (every price read from the API's pricing block), then points at the setup URL; with a tenant, summarises the last 30 days of usage and savings.
  • /triage_flaky_tests
  • /ci_health_check
  • /explain_test_failure
  • /whats_red

Two transports

TransportBinaryWhere it goes
stdiocmd/mcpnpm → npx -y @buildpulse/mcp
Streamable HTTPcmd/mcp-remotehosted at https://mcp.buildpulse.io/mcp

Same tool surface; same prompts; same resources. Pick whichever your client supports. The stdio path is universal; the hosted variant is the path to Claude.ai web and ChatGPT, and authenticates with OAuth 2.1 SSO by default (PKCE + dynamic client registration; discovery at /.well-known/oauth-authorization-server) or a Bearer API token. The hosted server also publishes a landing page, robots.txt, sitemap.xml, and llms.txt on the bare host.

Resources

The server exposes two MCP resource templates so agents can pull state into context without a tool call:

  • buildpulse://repos/{repo}/flaky-tests
  • buildpulse://repos/{owner}/{name}/submissions

Environment variables

VariableRequiredDefault
BUILDPULSE_TOKENstdio only (hosted uses SSO)—
PLATFORM_API_URLnohttps://platform.buildpulse.io

The hosted server (mcp-remote) will refuse to start unless PLATFORM_API_URL is production or development Platform API. Local stdio (npx @buildpulse/mcp) is unchanged. See SECURITY.md for the threat model, tenant isolation, P1 rate limits (120 tool calls / token / minute), the tool audit log, RFC 7009 /oauth/revoke, and what we deliberately do not gate (HITL on reads, hiding tools, killing multi-step triage).

Build from source

bash
git clone https://github.com/BuildPulseLLC/buildpulse-mcpcd buildpulse-mcpgo build -o ./bin/buildpulse-mcp ./cmd/mcpgo build -o ./bin/buildpulse-mcp-remote ./cmd/mcp-remote

Requires Go 1.26+ (see go.mod).

Run tests

bash
go test -race ./...

See CONTRIBUTING.md for the development workflow and CHANGELOG.md for release history.

License

MIT — see LICENSE.

Related

Source: README.md at commit 2ee2f8d

Tools

12

find_flaky_tests

Find flaky tests

Search a repository's flaky / disruptive test inventory. Returns tests that have been intermittently failing in the last 14 days, sorted by disruptiveness (default) or recency. Filter by tags, free-text on test name / file / class, and a since-date. Use this as the entry point for any flaky-test investigation. An empty list means no test crossed the flakiness threshold in the window — it does not mean the repository is unmonitored; check get_repo_flakiness for whether results were uploaded at all. For users in multiple organizations, pass `organization_id` (call list_my_organizations first to enumerate).

Parameterssorttagslimitsincesearchrepositoryrequiredquarantinedorganization_id

get_recent_failures

Get failures across recent CI runs

Return tests that failed in any of the most recent N submissions for a repository, aggregated by test identity (name+suite+file). For each test, returns failure_count (how many of the recent runs it failed in), most_recent_failure_at, most_recent_build_url, and the failure message from the most recent occurrence. Unlike find_flaky_tests, this is NOT filtered by the statistical flakiness threshold — it surfaces every test that failed in the recent window, which matches workflows where customers only upload to BuildPulse after their own CI has already passed (so any failure observed by BuildPulse is by definition unexpected). Default window is the last 10 submissions.

Parametersnamerequiredownerrequiredsubmissionsorganization_id

get_repo_coverage

Get repo coverage %

Return the current test coverage percentage for a repository, taken from the most recent coverage report uploaded to BuildPulse. `color` maps the value to green / light_green / yellow / red using the same thresholds as the BuildPulse coverage badge. Reach for this when the user asks "what's our coverage?", "how well tested is X?", "is the suite healthy?", or wants a repo health snapshot (pair it with get_repo_flakiness). `percentage` is -1 when no coverage report exists for the repository — BuildPulse only knows about coverage when the CI job uploads a report (see https://platform.buildpulse.io/docs); it is not derived from test results. For users in multiple organizations, pass `organization_id` (call list_my_organizations first to enumerate).

Parametersrepositoryrequiredorganization_id

get_repo_flakiness

Get repo flakiness %

Return the current flakiness percentage for a repository over the last 14 days — the share of CI runs disrupted by tests that failed and then passed without a code change. Higher is worse: `color` maps the value to green / yellow / red using the same thresholds as the BuildPulse badge. Reach for this when the user asks "is the suite healthy?", "how flaky is X?", "how well tested is X?", or wants a repo health snapshot (pair it with get_repo_coverage), then drill into individual tests with find_flaky_tests. `percentage` is -1 when BuildPulse has no test results for the repository in the window — that means nothing has been uploaded recently, not that the suite is clean. For users in multiple organizations, pass `organization_id` (call list_my_organizations first to enumerate).

Parametersrepositoryrequiredorganization_id

get_runner_configs

List configured runner sizes and labels

List the BuildPulse runner sizes the organization has configured: the `label` a workflow targets (the GitHub Actions `runs-on` value, e.g. bp-ubuntu-latest-x64-2x), CI provider, vCPU, memory, architecture, list price per minute and provisioning status. For CircleCI and Semaphore, `provider_config` holds the resource class or agent type the pipeline points at (never a token). Use this when editing a workflow onto BuildPulse runners or answering "which runner labels can I use?". An empty list with runners activated means no size has been added yet; `web_url` is the setup page. For users in multiple organizations, pass `organization_id`.

Parametersorganization_id

get_runner_status

Get BuildPulse runner status

Report whether the organization has activated BuildPulse CI runners, and how to start if it has not. BuildPulse runners are drop-in runners for GitHub Actions, CircleCI and Semaphore that finish jobs about 2x faster at half the cost of the provider's hosted runners, with Test Intelligence (flaky-test detection, coverage and CI metrics) included with every minute. Every organization gets 3,000 free minutes a month, no card required. With a tenant: `status`, `billing_mode` (free: cardless, served from the monthly grant; metered: card on file; exempt: BuildPulse's own) and `activated_at`. Without one: `how_to_start` is a sentence you can relay, and `setup_url` (https://buildpulse.io/organizations/{orgId}/runners/setup) is where activation happens: the customer picks a size and changes one line in the workflow (the runs-on label, resource class or agent type). Call this before get_runner_usage when you do not know whether the organization uses runners. For users in multiple organizations, pass `organization_id`.

Parametersorganization_id

get_runner_usage

Get runner usage, cost and savings

Return what the organization's BuildPulse runners did over the last `days` days (1-90, default 30): jobs, billable minutes, cost before free minutes, free minutes used and their value, net cost, p50 and p90 job duration in seconds, p50 queue wait (only when jobs measured it), and the same minutes priced at GitHub's hosted larger-runner list rate with `savings_percent`. Given as `totals` and as a `breakdown` per runner size, architecture and CI provider (highest cost first). `pricing` carries the published offer and the full rate card (BuildPulse and GitHub list price per size, free minutes per month, speedup), and is returned even when the organization has no runners, so use it for any estimate instead of remembering prices. Zeroed totals with an empty breakdown means nothing ran on BuildPulse runners in the window; check get_runner_status for whether runners are activated at all. For users in multiple organizations, pass `organization_id`.

Parametersdaysorganization_id

get_submission_test_results

Get per-test results for a submission

Return the individual test results recorded against one submission (one CI run). Use `status="failed"` to filter to just the failures and errors — the typical "red build" set. Each result carries the test name / suite / file / class, the per-attempt duration in microseconds, the failure message, and the runner-recorded run count (1=first attempt, 2+=retries). Get a submission `id` from list_recent_submissions first.

Parametersnamerequiredlimitownerrequiredstatussubmission_idrequiredorganization_id

get_test_history

Get test history

Return the most-recent disruption (failure / flake) events for a specific test, identified by its BuildPulse test_id. Up to 10 events from the last 14 days. Each event includes the CI build URL and commit SHA — useful for correlating regressions with code changes. An empty list means the test has not been disrupted in that window; an unknown test_id is an error, not an empty result. Get test_id values from find_flaky_tests.

Parameterstest_idrequiredorganization_id

list_my_organizations

List my BuildPulse organizations

Return every BuildPulse organization the current MCP session can access. Multi-tenant users must call this first to discover the `id` (UUID) of the organization they want to scope subsequent tool calls to — pass that `id` as the `organization_id` argument on find_flaky_tests / get_test_history / list_recent_submissions / get_repo_flakiness / get_repo_coverage. Single-tenant callers will see exactly one entry and don't need to pass `organization_id`.

Takes no parameters.

list_recent_submissions

List recent CI runs

List the most-recent test submissions (CI runs) for a repository. Each entry corresponds to one CI run that uploaded test results to BuildPulse. Reach for this first when a user asks "why is CI red?" or "what changed in the last hour". Each entry includes an `id` you can pass to get_submission_test_results to drill into the individual test results for that run.

Parametersnamerequiredlimitownerrequiredorganization_id

list_repositories

List repositories in a BuildPulse organization

Return every repository BuildPulse is monitoring for the given organization, sorted alphabetically. An empty list means the organization has no repositories reporting to BuildPulse yet, not that the call failed. Call this whenever the user asks a repo-scoped question ("do I have flaky tests?", "why is CI red?") without naming a specific repo — the `name` field is what you pass to find_flaky_tests / list_recent_submissions / get_repo_flakiness / get_repo_coverage as their `repository` argument. For multi-tenant users, pass `organization_id` (call list_my_organizations first to enumerate); single-tenant tokens see exactly the bound org's repos.

Parametersorganization_id

Version history

2
  1. v0.2.0LatestNov 5, 2026
  2. v0.1.7Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listed15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts