About Buildkite MCP Server
Buildkite MCP Server exposes Buildkite organization, pipeline, build, and job information, plus job retry operations. It is for teams that need to inspect CI results and troubleshoot failed builds through MCP clients.
Key features
- 01List organizations and pipelines
- 02Filter and inspect builds
- 03Retrieve job details and logs
- 04Review failed jobs and specs
- 05Retry jobs
Use cases
- 01Find failed builds for a pipeline
- 02Inspect job logs and test failures
- 03Retry a failed Buildkite job
MCP support
It provides MCP tools for querying Buildkite organizations, pipelines, builds, jobs, logs, and failures, as well as retrying jobs. Access requires a Buildkite API token.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEBuildkite MCP Server
A microservice for retrieving information from Buildkite via Model Context Protocol (MCP).
Setup
- Clone this repository
- Run
npm install - Set the
BUILDKITE_ACCESS_TOKENenvironment variable - Start the server with
node index.js
Using with Cursor (MCP Integration)
To add this server to Cursor, you need to configure it in your ~/.cursor/config/mcp.json file:
{
"mcpServers": {
"buildkite": {
"command": "npx",
"args": [
"-y",
"@drew-goddyn/buildkite-mcp"
],
"env": {
"BUILDKITE_ACCESS_TOKEN": "your-buildkite-access-token"
}
}
}
}
With this configuration:
- You don't need to install or run the server manually
- Cursor will automatically start and stop the server as needed
- Replace
your-buildkite-access-tokenwith your actual Buildkite API token
After updating the configuration, restart Cursor to apply the changes.
MCP Endpoints
List Organizations
POST /mcp_buildkite_list_organizations
Request Body:
{
"access_token": "optional-if-set-in-env"
}
Response:
[
{
"id": "org-id",
"name": "Organization Name",
"slug": "organization-slug"
}
]
List Pipelines
POST /mcp_buildkite_list_pipelines
Request Body:
{
"organization": "my-org",
"access_token": "optional-if-set-in-env"
}
Response:
[
{
"id": "pipeline-id",
"name": "Pipeline Name",
"slug": "pipeline-slug"
}
]
List Builds
POST /mcp_buildkite_list_builds
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"access_token": "optional-if-set-in-env",
"branch": "main",
"state": "failed",
"per_page": 10,
"page": 1
}
Response:
[
{
"id": "build-id",
"number": 123,
"state": "failed"
}
]
Get Build Details
POST /mcp_buildkite_get_build
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"build_number": 123,
"access_token": "optional-if-set-in-env"
}
Response:
{
"id": "build-id",
"number": 123,
"jobs": [
{
"id": "job-id",
"name": "Job Name",
"state": "failed"
}
]
}
List All Jobs
POST /mcp_buildkite_list_jobs
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"build_number": 123,
"access_token": "optional-if-set-in-env"
}
Response:
[
{
"id": "job-id",
"name": "Job Name",
"state": "failed"
}
]
List Failed Jobs
POST /mcp_buildkite_list_failed_jobs
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"build_number": 123,
"access_token": "optional-if-set-in-env"
}
Response:
[
{
"id": "01234567-89ab-cdef-0123-456789abcdef",
"name": "Test Job",
"state": "failed",
"web_url": "https://buildkite.com/my-org/my-pipeline/builds/123#01234567-89ab-cdef-0123-456789abcdef"
}
]
List Job Spec Failures
POST /mcp_buildkite_list_job_spec_failures
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"build_number": 123,
"job_id": "01234567-89ab-cdef-0123-456789abcdef",
"access_token": "optional-if-set-in-env"
}
Response:
[
{
"type": "RSpec",
"spec": "./spec/path/to/file_spec.rb:123",
"message": "Expected result to be X but got Y"
}
]
Get Job Log
POST /mcp_buildkite_get_job_log
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"build_number": 123,
"job_id": "01234567-89ab-cdef-0123-456789abcdef",
"access_token": "optional-if-set-in-env",
"limit": 100 // optional, defaults to all content
}
Response:
{
"content": "...log content...",
"size": 12345,
"format": "raw"
}
List Failed Specs from Build URL
POST /mcp_buildkite_list_failed_specs
Request Body:
{
"build_url": "https://buildkite.com/my-org/my-pipeline/builds/123",
"access_token": "optional-if-set-in-env"
}
Response:
{
"build_url": "https://buildkite.com/my-org/my-pipeline/builds/123",
"failed_job_count": 2,
"jobs": [
{
"id": "01234567-89ab-cdef-0123-456789abcdef",
"name": "Test Job 1",
"web_url": "https://buildkite.com/my-org/my-pipeline/builds/123#01234567-89ab-cdef-0123-456789abcdef",
"failures": [
{
"spec": "./spec/path/to/file_spec.rb:123",
"message": "Expected result to be X but got Y"
}
]
},
{
"id": "fedcba98-7654-3210-fedc-ba9876543210",
"name": "Test Job 2",
"web_url": "https://buildkite.com/my-org/my-pipeline/builds/123#fedcba98-7654-3210-fedc-ba9876543210",
"failures": []
}
],
"failures": [
{
"job_id": "01234567-89ab-cdef-0123-456789abcdef",
"job_name": "Test Job 1",
"job_url": "https://buildkite.com/my-org/my-pipeline/builds/123#01234567-89ab-cdef-0123-456789abcdef",
"spec": "./spec/path/to/file_spec.rb:123",
"message": "Expected result to be X but got Y"
}
]
}
Retry Job
POST /mcp_buildkite_retry_job
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"build_number": 123,
"job_id": "01234567-89ab-cdef-0123-456789abcdef",
"access_token": "optional-if-set-in-env"
}
Response:
{
"id": "job-id",
"state": "scheduled"
}
List Pipeline Build Failures
POST /mcp_buildkite_list_pipeline_build_failures
Request Body:
{
"organization": "my-org",
"pipeline": "my-pipeline",
"state": "finished",
"per_page": 10,
"page": 1,
"access_token": "optional-if-set-in-env"
}
Response:
[
{
"build_number": 123,
"build_url": "https://buildkite.com/my-org/my-pipeline/builds/123",
"failed_jobs": [
{
"name": "Test Job",
"url": "https://buildkite.com/my-org/my-pipeline/builds/123#01234567-89ab-cdef-0123-456789abcdef"
}
]
}
]
Environment Variables
BUILDKITE_ACCESS_TOKEN: Your Buildkite API token with read accessPORT: (Optional) Port to run the server on (default: 63330)
Error Handling
The server returns appropriate HTTP status codes and error messages when something goes wrong:
400: Bad Request - Missing or invalid parameters401: Unauthorized - Invalid or missing access token404: Not Found - Resource not found500: Internal Server Error - Server-side error
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.