ClaudeとBuildkiteを連携してパイプラインとジョブログを調査する
BuildkiteのMCPサーバーをClaude Codeとclaude.aiに繋ぎ、リモート型とローカル型の使い分け、ログ検索、非特権コンテナでの安全な運用を扱います。
BuildkiteのCIが落ちたとき、ビルド番号やURLをClaudeに渡して原因を調べさせたい。その入口になるのが、Buildkiteが公開しているオープンソースのMCPサーバーです。パイプライン・ビルド・ジョブのデータに加え、Test Engineのテスト結果までAIアシスタントから扱えます。接続先はBuildkiteがホストするリモート型と、自分で動かすローカル型の2種類です。Claude Code・claude.ai・Claude Desktopへの接続手順、調査に使うツール、書き込みを止める設定を順に扱います。
リモート型とローカル型、どちらを使うか
Buildkite MCPサーバーの2つの型
リモート型
https://mcp.buildkite.com/mcpでBuildkiteがホストします。認証はBuildkiteユーザーアカウントに基づく短命なOAuthトークンで、APIトークンを自分で持つ必要がありません。更新はBuildkite側で自動的に反映されます。REST APIのレート制限は、組織のものとは別枠です。
ローカル型
自分のマシンやコンテナで動かし、APIアクセストークンで認証します。トークンは平文で保管することになり、漏えい対策とアップグレードは自分の仕事です。使った分は組織の通常のREST APIレート制限に数えられます。Buildkiteパイプラインから呼ぶ自動化で、実行するバージョンを固定したい場合の選択肢です。
リモート型には、用途の違うエンドポイントが3つあります。
| エンドポイント | 認証 | 向く用途 |
|---|---|---|
https://mcp.buildkite.com/mcp | 認証対話的なOAuth | 向く用途プロンプトから直接使うAIツール |
https://mcp.buildkite.com/mcp/readonly | 認証対話的なOAuth(読み取りのみのトークン) | 向く用途調査だけをさせたいとき |
https://mcp.buildkite.com/direct | 認証Authorization: BearerヘッダーのAPIトークン | 向く用途OAuthを完了できないヘッドレスなエージェント |
OAuth型は、対話認証を完了できない自動ワークフローには向きません。パイプラインの中からAIエージェントとして呼ぶなら、バージョンを固定できるローカル型を選びます。トークンをすでに持つ常駐エージェントなら/directも使えます。
BuildkiteのMCPサーバーは開発が活発で、ツールや挙動が変わったり削除されたりする可能性があります。特定のツールの挙動を保ちたいときは、版を固定します。Dockerならbuildkite/mcp-serverをbuildkite/mcp-server:<version>のようなタグに替えるか、特定リリースのバイナリを使います。Buildkiteがホストするリモートのエンドポイントは自動で更新され、版を固定できません。
Claude Codeにリモートサーバーを繋ぐ
Claude Codeのインストール後、次のコマンドでリモートサーバーを追加します。
claude mcp add --transport http buildkite https://mcp.buildkite.com/mcp追加後の初回接続でOAuthの認可画面が開きます。Buildkiteの組織を選んでAuthorizeを押す流れで、組織がSSOを求める場合は先にSSOでログインしてから戻ります。Claude Code v2.1.289のclaude mcp add --helpには、HTTPサーバー向けに-t, --transportと-H, --headerが載っています。保存先を選ぶ-s, --scopeの既定はlocalです。ヘルプの例には、--header "Authorization: Bearer ..."でヘッダーを渡す書式も載っています。
複数の組織を使い分ける
複数のBuildkite組織に所属していると、認可画面でどの組織に許可を与えたのかが曖昧になります。URLにorganizationパラメーターを付けると、認可画面でその組織が選択済みになります。組織ごとに別名で登録すれば、ツール呼び出しがどの組織に向かうのかも名前で区別できます。
claude mcp add --transport http buildkite-acme "https://mcp.buildkite.com/mcp?organization=acme"
claude mcp add --transport http buildkite-other "https://mcp.buildkite.com/mcp?organization=other"このパラメーターは認可画面の初期選択を決めるだけで、アクセス制御ではありません。slugの代わりにorganization_uuidも使えます。
claude.aiとClaude Desktopにカスタムコネクタとして繋ぐ
カスタムコネクタの追加と認可
- 1
コネクタ画面を開く
個人のPro・Maxプランは「Settings > Connectors」です。Team・Enterpriseプランでは、OwnerまたはPrimary Ownerが「Admin settings > Connectors」から追加します。
- 2
Add custom connector を選ぶ
名前に
Buildkite、リモートMCPサーバーのURLにhttps://mcp.buildkite.com/mcpを入力して追加します。 - 3
Connect を押して認可する
「Settings > Connectors」でBuildkiteの「Connect」を押します。TeamまたはEnterpriseなら、先に「Your connectors」タブを開く必要がある場合があります。認可画面では組織を選び、SSOが必須の組織はまずSSOでログインしてからAuthorizeします。
組織のAPI IPアドレス許可リストを設定している場合は、BuildkiteのegressのIPアドレスを許可リストに加える必要があります。リモートMCPサーバーはBuildkiteのインフラからAPIを呼ぶためです。そのアドレスはBuildkiteのmeta APIから取得できます。API呼び出しはこの許可リストの対象です。
ツールセットを絞るときは、コネクタをツールセットごとに別々に作ります。名前はBuildkite - pipelines toolsetのように、絞り込みの内容が分かるものにします。URLはhttps://mcp.buildkite.com/mcp/x/pipelinesの形で、複数のコネクタを同じセッションで使うには、それぞれに接続します。
ローカルMCPサーバーをDockerで動かす
ローカル型は、Buildkiteパイプラインから呼ぶ自動化や、実行バージョンを固定したい場合に使います。Docker 20.x以降が必要です。イメージはcgr.dev/chainguard/staticを土台にし、非特権ユーザーで動きます。READMEは、安全に動かすためにコンテナでの実行を勧めています。
docker pull buildkite/mcp-server
docker run --pull=always -q -it --rm \
-e BUILDKITE_API_TOKEN=<api-token-value> \
buildkite/mcp-server stdioClaude Codeからこのローカルサーバーに繋ぐには、Docker実行とバイナリ実行で登録コマンドが変わります。
# Docker で動かす場合
claude mcp add buildkite -- docker run --pull=always -q --rm -i \
-e BUILDKITE_API_TOKEN=bkua_xxxxx buildkite/mcp-server stdio
# ビルド済みバイナリを入れている場合
claude mcp add buildkite --env BUILDKITE_API_TOKEN=bkua_xxxxx -- buildkite-mcp-server stdioClaude Desktopから使うなら、claude_desktop_config.jsonに書きます。ファイルは「Settings > Developer > Edit Config」ボタンから開けます。
--pull=alwaysは、起動のたびに最新のイメージを取得する指定です。APIアクセストークンは、Buildkiteのユーザー設定の「API Access Tokens」から発行します。
トークンのスコープは最小限にできます。最小構成はread_builds・read_pipelines・read_userで、ログを読むならread_build_logsを足し、書き込みを許すときだけwrite_buildsを加えます。
ローカル型には、自前ホストのHTTPモードもあります。buildkite-mcp-server httpで起動すると、http://localhost:3000/mcpでストリーミングHTTPとして待ち受けます。このモードではOAuthは起動しません。トークンを1Passwordに置く場合の環境変数としてBUILDKITE_API_TOKEN_FROM_1PASSWORDもあります。
Buildkite MCPで何ができるか
MCPサーバーはBuildkiteのREST APIをラップしています。ツールは多数ありますが、障害調査で頻繁に触れるのは次のあたりです。
| カテゴリ | 代表ツール | できること |
|---|---|---|
| パイプライン | 代表ツールlist_pipelines / get_pipeline | できること一覧取得、設定とステップの確認 |
| ビルド | 代表ツールlist_builds / get_build / create_build / cancel_build / rebuild_build | できること状態確認、新規作成、キャンセル、再実行 |
| ジョブ | 代表ツールlist_jobs / get_job / retry_job / unblock_job | できること状態確認、再試行、ブロック解除 |
| 調査 | 代表ツールget_build_failure_summary / compare_builds | できること失敗の要約、同じブランチで直近に成功したビルドとの差分 |
| ログ | 代表ツールsearch_logs / tail_logs / read_logs | できること正規表現検索、末尾表示、行番号指定の読み取り |
| Test Engine | 代表ツールlist_tests / get_failed_executions | できることテストの実行履歴と失敗の詳細 |
| アノテーション | 代表ツールlist_annotations / create_annotation | できることビルド画面の注釈の閲覧と追加 |
ジョブの再試行やブロック解除のツールは、buildsツールセットに含まれます。
繋いだだけでは監視されない
コネクタを繋いでも、AIツールがビルドを見張り始めるわけではありません。「Buildkite MCPサーバーを使って」とはっきり頼む必要があります。ビルドの完了待ちにはwait_for_buildがあり、1回の呼び出しで最長45秒待ちます。ブロックされたビルドは「終わった」とみなされ、入力待ちだと報告されます。長く見張らせるには、AIツール側で呼び出しを繰り返すか、自前のスケジュールを使います。
ビルド失敗を調べる流れ
失敗したビルドを調べる
- 1
ビルドを指定する
組織・パイプライン・ビルド番号、またはビルドのURLを渡します。読み取りだけに限りたいときは、プロンプトに「読み取り専用の呼び出しだけを使う」と添えます。
- 2
失敗の要約を取る
get_build_failure_summaryが、問題のジョブ、ログの末尾、エラーと警告の注釈、取得できた失敗テストをまとめて返します。結果は部分的なことがあるので、欠けた証拠や途中で切れたログがないかを先に確かめます。 - 3
ログとテストを掘る
要約で足りなければ
search_logsやtail_logsでログを調べ、Test Engineの結果があればget_failed_executionsを使います。結果をアップロードしていないビルドでは、テストの証拠は出ません。 - 4
書き込みは承認してから
再試行や新規ビルドは状態を変え、デプロイを含むパイプラインのコマンドを実行する場合もあります。AIツール側で、書き込みに承認を求める設定にしておきます。
ログのツールは、ジョブのログをParquet形式にして保存し、検索や読み取りを速くします。完了や失敗、キャンセルといった終了状態のジョブのログは保存され続けます。実行中やブロック中のジョブのログは、30秒だけ保持されます。ローカル型の保存先は、物理マシンならホームの.bklog、コンテナなら/tmp/bklogで、BKLOG_CACHE_URLでローカルパスかs3://に変えられます。
ツールセットと読み取り専用で権限を絞る
MCPサーバーはツールをツールセットにまとめています。user・pipelines・builds・investigations・logs・artifacts・annotations・tests・clustersなどです。必要なものだけを有効にすると、AIツールが触れるBuildkite APIの範囲が狭まります。
注意が要るのは、buildsツールセットが読み取りだけではない点です。create_build・cancel_build・rebuild_build・retry_job・unblock_jobがここに含まれます。調査だけをさせたいなら、buildsを入れたうえで読み取り専用を併用します。
リモート型で単一のツールセットに絞るには、URLに/x/{ツールセット名}を足します。
claude mcp add --transport http buildkite-builds https://mcp.buildkite.com/mcp/x/builds/readonly複数のツールセットを組み合わせるときは、読み取り専用のURLにヘッダーでツールセットを渡します。
claude mcp add --transport http buildkite-read-only-toolsets \
https://mcp.buildkite.com/mcp/readonly \
--header "X-Buildkite-Toolsets: user,pipelines,builds"ローカル型でも同じ絞り込みができます。Dockerなら環境変数のBUILDKITE_TOOLSETSとBUILDKITE_READ_ONLY、バイナリなら--enabled-toolsetsと--read-onlyを使います。何も指定しなければ全ツールセットが有効で、トークンの権限で許される範囲のBuildkite APIに触れられます。
用途別の組み合わせ例です。userツールセットは基本情報を返すので、どの構成にも入れておきます。
| 用途 | ツールセット |
|---|---|
| CI/CD管理 | ツールセットuser + pipelines + builds |
| デバッグ・障害調査 | ツールセットuser + investigations + builds + logs + tests + annotations |
| 全権限 | ツールセット指定せず素のURLをそのまま使う |
一部だけ書き込みを許したい場合は、読み取り用と書き込み用に設定を2つ作ります。たとえばbuildsは通常のURLで、userとpipelinesは読み取り専用のURLで、という分け方です。名前はbuildkite-read-only-user-pipelinesのように、権限が分かるものにします。
/directのAPIトークン経由では、トークンの権限が接続とは別に残ります。そのため読み取りのエンドポイントを選んでも、トークン自体の権限は小さくしておく必要があります。
CLAUDE.mdにヒントを書いて精度を上げる
Buildkiteは、AGENTS.md(Claude CodeではCLAUDE.md)に組織名とパイプラインslugのヒントを書くことを勧めています。ツールが繋がっていても、どの組織のどのパイプラインかをClaudeが推測する状態だと、質問のたびに確認が挟まります。
- **CI/CD**: `my-buildkite-organization` Buildkiteオーガニゼーション、build/testは`my-pipeline`パイプラインslug(`.buildkite/pipeline.yml`)、リリースは`my-pipeline-release`パイプラインslug(`.buildkite/pipeline.release.yml`)自分の組織名・パイプラインslug・設定ファイル名に置き換え、アーキテクチャ節などに1行加えます。
よくあるつまずき
リモート型のOAuthアクセストークンの有効期限は12時間、リフレッシュトークンは7日間です。放置したセッションで急に認証エラーが出たら、期限切れを疑って再認証します。
リモート型のレート制限は、ユーザーごとに1分あたり50リクエストです。OAuthの/mcpと/directのどちらにも同じ上限がかかり、組織のREST APIの枠は消費しません。上限を超えると429が返り、ウィンドウは60秒で戻ります。各レスポンスのRateLimit-RemainingとRateLimit-Resetで残りの回数を確かめられ、RateLimit-Resetは日時ではなく、次のウィンドウまでの秒数です。自動リトライを組むなら、この値をそのまま待機秒数に使えます。429の本文にも、待つべき秒数が文章とresetフィールドで入ります。
ローカル型は逆に、組織の標準のREST APIレート制限を消費します。
読み取り専用のエンドポイントでは、必要なトークンスコープがread_で始まるツールと、スコープ指定のないツールだけが使えます。ビルドの作成やジョブの再試行を頼んで失敗するのは、権限不足であって設定ミスではありません。接続しているURLが/readonly付きかを見ます。
cache_registriesツールセットは、ローカル型のv1.24.0以前には存在しません。古いバイナリやイメージを使い続けていると、ツールセットを指定してもツールが現れないので、版を確かめます。
まとめ
個人の対話利用はリモート型、バージョンを固定したい自動化はローカル型です。/directやローカル型はAPIトークンで動くので、スコープをread_builds・read_pipelines・read_userの最小構成から始め、書き込みが要るときだけwrite_buildsを足します。Kubernetes側のMCPサーバー運用でも、権限を絞る考え方は共通します。詳しくはKubernetes MCPサーバーの記事にあります。IaC寄りの構成管理まで任せたい場合はTerraform MCPサーバーも参考になります。
コネクタの権限設定でつまずきやすい点は、Claude Connectorsの権限設定でよくある失敗にあります。