CLAUDE LABEN
MCP — 2026-07-28 仕様への対応が Claude 製品群で広がっています。双方向ステートフルなプロトコルからリクエスト・レスポンス型へ移り、MCP サーバーをサーバーレスやエッジに置けるようになりましたEXTENSIONS — 公式拡張が3種そろいました。サーバー側で UI を描く MCP Apps、非同期の長時間処理を扱う Tasks、IdP 経由で組織単位に払い出す Enterprise Managed Auth ですADOPTION — MCP の月間 SDK ダウンロードが4億を超え、年内で約4倍になりました。エージェントとアプリケーションを繋ぐ標準としての位置づけが固まりつつありますQUOTA — Claude Code 契約者向けの週次利用枠 50% 上乗せは本日8月19日が最終日です。長時間のエージェント実行を回すなら今日が最後の機会になりますPRICING — Claude Sonnet 5 の導入価格 100万トークンあたり入力2ドル・出力10ドルは8月31日で終了し、9月1日から入力3ドル・出力15ドルへ移ります。残り12日ですFIX — タイムアウトが固定されたサーバーに対し MCP v2 接続がサブスクリプションを際限なく張り直す不具合が修正され、ユーザー帰属のための forward_user_identity 設定も追加されましたMCP — 2026-07-28 仕様への対応が Claude 製品群で広がっています。双方向ステートフルなプロトコルからリクエスト・レスポンス型へ移り、MCP サーバーをサーバーレスやエッジに置けるようになりましたEXTENSIONS — 公式拡張が3種そろいました。サーバー側で UI を描く MCP Apps、非同期の長時間処理を扱う Tasks、IdP 経由で組織単位に払い出す Enterprise Managed Auth ですADOPTION — MCP の月間 SDK ダウンロードが4億を超え、年内で約4倍になりました。エージェントとアプリケーションを繋ぐ標準としての位置づけが固まりつつありますQUOTA — Claude Code 契約者向けの週次利用枠 50% 上乗せは本日8月19日が最終日です。長時間のエージェント実行を回すなら今日が最後の機会になりますPRICING — Claude Sonnet 5 の導入価格 100万トークンあたり入力2ドル・出力10ドルは8月31日で終了し、9月1日から入力3ドル・出力15ドルへ移ります。残り12日ですFIX — タイムアウトが固定されたサーバーに対し MCP v2 接続がサブスクリプションを際限なく張り直す不具合が修正され、ユーザー帰属のための forward_user_identity 設定も追加されました
記事一覧/API & SDK
API & SDK/2026-04-17上級

Claude API で作る GitHub PR レビューボット — Webhook統合からセキュリティスキャン・品質スコアリングまで実装

Claude API × GitHub Webhook で PR レビューボットを実装します。Tool Use で構造化スコアリング・セキュリティ検査・改善提案を自動化し、署名検証・デバウンス・レート制限・コスト管理まで実運用で得た知見をまとめました。

Claude API117GitHub6PR レビューTool Use6Webhook4TypeScript24自動化77コードレビュー5

プレミアム記事

チームの規模が5人を超えたころから、コードレビューの「ムラ」が気になり始めました。同じようなバグパターンを、あるメンバーは毎回指摘するのに別のメンバーはスルーしてしまう。疲れているときはレビューが甘くなります。そして何より、全員がレビューの「基準」を共有できていません。

Claude API を使えば、このムラを大きく減らせます。ただし「コードを渡してレビューして」と素朴にお願いするだけでは、返ってくる内容がいつも違って運用に耐えません。重要なのは、Tool Use を使って構造化されたレビュー結果を得ることと、GitHub Webhook から一気通貫のパイプラインを設計することです。

ここではGitHub に PR が作成されたときに自動でレビューコメントを投稿するボットを、実際に動くコードで構築します。アーキテクチャ設計から本番デプロイまで、各ステップで「なぜそう実装するのか」の理由も含めてお伝えします。

システム全体のアーキテクチャ

まず全体像を把握しましょう。処理の流れはシンプルです。

GitHub PR 作成/更新
    ↓
Webhook イベント送信(POST /webhook)
    ↓
Express サーバー(署名検証)
    ↓
GitHub API で PR diff 取得
    ↓
Claude API(Tool Use)でレビュー生成
    ↓
GitHub API でレビューコメント投稿

技術スタックは以下の通りです。

  • ランタイム: Node.js 22 + TypeScript
  • Webフレームワーク: Express.js 4.x
  • Claude API: @anthropic-ai/sdk v1.x
  • GitHub API: @octokit/rest v21
  • デプロイ先: Railway / Render(常時起動が前提)

なぜ常時起動サーバーが必要か

GitHub Webhook はリアルタイムで POST リクエストを送ってきます。Cloudflare Workers や Vercel Serverless Functions でも動作しますが、コールドスタートが発生するアーキテクチャは避けたほうが無難です。GitHub は Webhook のタイムアウトを10秒に設定しているため、コールドスタートで応答が遅れると再送ループに入ることがあります。

Railway であれば月$5程度から常時起動できます。個人プロジェクトや小規模チームには十分です。

まず依存関係をインストールします。

npm init -y
npm install express @anthropic-ai/sdk @octokit/rest
npm install -D typescript @types/express @types/node ts-node

Step 1: GitHub Webhook サーバーの実装

Webhook の受信から始めます。最初に詰まりやすいのが署名検証です。GitHub は Webhook リクエストに X-Hub-Signature-256 ヘッダーを付けて送ってきます。これを検証しないと、第三者から偽のリクエストを送られても判別できません。

// src/webhook.ts
import express from 'express';
import crypto from 'crypto';
import { handlePullRequestEvent } from './handlers/pullRequest';
 
const app = express();
 
// ⚠️ 重要: raw body が必要なため express.json() は使わない
app.use(
  express.raw({ type: 'application/json' })
);
 
function verifyWebhookSignature(
  rawBody: Buffer,
  signature: string,
  secret: string
): boolean {
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(rawBody);
  const expectedSignature = `sha256=${hmac.digest('hex')}`;
 
  // タイミング攻撃を防ぐため timingSafeEqual を使う
  try {
    return crypto.timingSafeEqual(
      Buffer.from(signature),
      Buffer.from(expectedSignature)
    );
  } catch {
    // 長さが違う場合は false(timingSafeEqual は同じ長さ必須)
    return false;
  }
}
 
app.post('/webhook', async (req, res) => {
  const signature = req.headers['x-hub-signature-256'] as string;
  const eventType = req.headers['x-github-event'] as string;
 
  if (!signature) {
    return res.status(401).json({ error: 'Missing signature' });
  }
 
  const isValid = verifyWebhookSignature(
    req.body as Buffer,
    signature,
    process.env.GITHUB_WEBHOOK_SECRET!
  );
 
  if (!isValid) {
    console.error('Invalid webhook signature — possible spoofed request');
    return res.status(401).json({ error: 'Invalid signature' });
  }
 
  // レスポンスを先に返す(GitHub のタイムアウト10秒対策)
  res.status(202).json({ accepted: true });
 
  const payload = JSON.parse((req.body as Buffer).toString());
 
  if (
    eventType === 'pull_request' &&
    ['opened', 'synchronize'].includes(payload.action)
  ) {
    // 非同期で処理(レスポンス後に実行)
    handlePullRequestEvent(payload).catch(err => {
      console.error('[PR handler] Unhandled error:', err);
    });
  }
});
 
app.get('/health', (_req, res) => {
  res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
 
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Webhook server listening on port ${PORT}`);
});

2つの重要なポイントがあります。

express.raw() を使う理由: express.json() は body をパースしてから渡してきます。しかし署名検証は生の bytes に対して HMAC を計算する必要があります。パース後の JSON 文字列では計算結果が一致しません。ここで詰まる方が非常に多いです。

レスポンスを先に返す理由: GitHub の Webhook タイムアウトは10秒です。Claude API の呼び出しには数秒かかることがあるため、202 Accepted を即座に返してから処理を非同期で続けます。レスポンスを待ってから処理すると、タイムアウトで GitHub が再送し、同じ PR が2回レビューされる事態になります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
express.raw() による署名検証と 202 即時応答で、GitHub の 10 秒タイムアウトと再送ループを防ぐ実装
Tool Use(tool_choice: any)で overall_score・security_issues を構造化し、指数バックオフで本番のばらつきを抑える設計
デバウンス 30→90 秒で重複レビュー約7割減、出力トークンは指摘ゼロで 600〜900・critical 含むと 2,500〜3,500 という運用実測
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-05-05
週次レポートの手作業から解放される — Claude API × GitHub × Linear × Slack の自動化実装
毎週のSlack進捗報告をClaude APIで自動化する実装ガイド。GitHub・LinearのデータをClaude APIで整形してSlackに投稿するNode.jsシステムを、実際のコードを交えて解説します。
API & SDK2026-08-01
会話の途中でツールを差し替える — プロンプトキャッシュを守るツールレジストリの設計
ターン間でツールを追加・削除できるようになった一方、ツール定義はキャッシュプレフィックスの最前列にあります。12種類の変更を指紋で実測し、安定コアと揮発テールに分けるレジストリ設計とガード実装をまとめました。
API & SDK2026-07-09
RAG が自信たっぷりに間違え始めたとき — 検索の取りこぼしを接地率で計測する運用メモ
Claude API の RAG で、回答は流暢なのに事実がずれ始める。多くの場合、原因は検索側で答えを含む文書を取りこぼすサイレントなリコール低下です。接地率と検索ヒット率を計測し、段階的に立て直した運用メモを、動くコードと実数値付きで残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →