🫥

MCPサーバーで始める不具合分析の自動化に挑戦中

に公開

はじめに

Social Databank Advent Calendar 2025 の1日目です。

今回は現在QAチームで取り組んでいる不具合の自動分析について説明したいと思います。

現在SDBではプロダクトの規模、参加する開発者も増えてきました。そのため、増加するリリースに耐えられるようにCI/CDや自動テストなどの取り組みを行っています。

その中の1つに不具合分析をしていますが、不具合の管理〜分析に工数がかかるという問題がありました。
また、不具合の共有が遅れてしまえば、内容を忘れ陳腐化することもあります。

そのため、不具合に関わる項目を自動化することで共有までの工数短縮を図ることになりました

全体構想

最終的には以下の図のようなシステムを作りたいと思っています。


不具合分析自動化の全体図

  1. Githubに不具合修正のPRを作成する
    a. PRに「bug」とlabelをつけると、GitHub Actionsが起動
    b. Notionに自動でチケットが作成される
  2. MCPサーバーを立ち上げ、AIに接続する
  3. 不具合管理表、GithubにあるPR、学習の資料をMCPサーバーが読み込む
  4. 読み込んだ内容をもとに不具合を分析し、不具合レポートにまとめる

こちらは現在、1〜2を作成し3のMCPサーバー部分の開発に取り組んでいます。そのため、今回は作成途中のところを解説し、残りは出来上がってから再度ブログに書きたいと思います

不具合起表の自動化

最初に取り掛かったのは不具合起票の自動化です。


不具合起票の自動化

こちらはGithub Actionを使って「bug」というラベルをつけると、自動でNotionのテーブルにチケットが作成されます。

BugTicket.mjs
const NOTION_SECRET = "Notionのシークレット";
const NOTION_DATABASE_ID = "NotionのDBのid";
const PR_TITLE = process.env.PR_TITLE;
const PR_URL = process.env.PR_URL;

if (!NOTION_SECRET || !NOTION_DATABASE_ID || !PR_TITLE || !PR_URL) {
  console.error('❌ 必要な環境変数が不足しています');
  process.exit(1);
}

// 起表日を作成
const currentDate = new Date().toISOString().slice(0, 10);

const TICKET_PROP = {
  TITLE: 'title',
  DATE: 'date', // 不具合の起表日
  PR_URL: 'PR_URL', //GithubのPR
  //ここにNotionの不具合管理表に入れたい項目を記載。
}

const payload = {
  parent: { database_id: NOTION_DATABASE_ID },
  properties: {
    [TICKET_PROP.TITLE]: {
      title: [
        {
          text: {
            content: PR_TITLE,
          },
        },
      ],
    },
    [TICKET_PROP.DATE]: {
      date: {
        start: currentDate,
      },
    },
    [TICKET_PROP.PR_URL]: {
      url: PR_URL,
    },
    ... // DBの項目が続く
  },
};

try {
  const response = await fetch('https://api.notion.com/v1/pages', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${NOTION_SECRET}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28',
    },
    body: JSON.stringify(payload),
  });

  const data = await response.json();
  if (response.ok) {
    console.log('✅ Notion ticket created successfully');
    console.log('Response:', data);
  } else {
    console.error(`❌ Failed to create Notion ticket (HTTP ${response.status})`);
    console.error('Response:', data);
    process.exit(1);
  }
} catch (err) {
  console.error('❌ Error while creating Notion ticket:', err);
  process.exit(1);
}
BugTicket.yml
name: Notionの不具合管理表にBugチケットを作成する

on:
  workflow_call:
    outputs:
      IS_FAILURE:
        description: jobがfailしたかどうかのフラグ
        value: ${{ jobs.send-release-announcement-to-slack.outputs.IS_FAILURE }}

jobs:
  create-ticket:
    if: github.event.label.name == 'bug'
    runs-on: ubuntu-latest
    outputs:
      IS_FAILURE: ${{ steps.is_failure.outputs.IS_FAILURE }}
    steps:
      - name: Generate github token
        id: generate_token
        uses: actions/create-github-app-token@v1
        with:
          app-id: ${{ secrets... }}
          private-key: ${{ secrets... }}
          owner: ${{ github.repository_owner }}
          repositories: "test"

      - name: Check out the target repository
        uses: actions/checkout@v4
        with:
          repository: test
          ref: master
          token: ${{ steps.generate_token.outputs.token }}
          path: test
      - name: Create Notion Bug Ticket
        env:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          NOTION_SECRET: ${{ secrets.NOTION_SECRET }}
          NOTION_DATABASE_ID: {NotionのDB_id}
          PR_TITLE: ${{ github.event.pull_request.title }}
          PR_URL: ${{ github.event.pull_request.html_url }}
        run: npx -y zx ./test/.github/createNotionBugTicket.mjs

この結果、PRに「bug」とつけるとGitHub Acitonsが動き、自動でNotionにチケットが作成されます。

MCPサーバーの開発

次にMCPサーバーを作成していきます。まずは、MCPサーバーとClaudeを繋ぐ②の部分を作っていきます


MCPサーバーの構築

とはいえ、MCPサーバーを立てるのは初めてなので、以下チュートリアルを参考に実施しました。

https://dev.classmethod.jp/articles/model-context-protocol-weather-server-tutorial/

結果として、チュートリアルの「米国の国立気象局」から気象データを取ってくるMCPサーバーが完成しました。


MCPサーバーの動作検証

MCPサーバーの学習部分を作成

ここからが現在取り組んでいる内容になります。チュートリアルから「米国の国立気象局」のAPIからデータを取ってくることができました。

次は弊社の不具合情報から、不具合を分析する機能を作成していきます。最初は不具合1件1件の分析を目指し、ある程度できた後に全体の不具合レポートを作成する予定です。


不具合分析の自動化

まずは以下の情報を収集できるようにします。

  • Githubから修正したコードの内容
  • Notionから不具合の情報
    • 重要度
    • 機能分類
    • 影響度
      などなど...

これらの情報をMCPサーバー経由でClaudeに渡し、結果をNotionの不具合管理表に記載します。実際の内容の精度は、結果を見ながら判断したいと思います

結果の精度向上

ここまで進めば、最後は分析結果の向上を目指します。この時点ではMCPサーバーに、

  • 修正したコードの内容
  • 不具合の分類した情報

を渡しています。

そもそも不具合分析をする目的は、「同じ不具合を出さないように」する再発防止です。そのため、分析結果から再発防止につながる必要があります。

現在の情報から目的に繋がらなければ、学習させる情報を増やす or 減らす選択肢を取る必要があります。

ここにどんな情報があれば精度が上がるのか、大変難しいと思いますので、さまざまな情報を入力して結果をまとめていきたいと思います。

終わりに

不具合の情報を一括で管理から分析するまでの一連の流れを述べました。まだ道半ばですが、今後はもっと自動化が進めばいいと思います。

今回は不具合分析のみでしたが、今後は分析結果から

  • テストケースの自動生成
  • テストコードの自動生成
  • テスト観点表の更新

などもできればもっと面白くなるのではないかと思います。

ソーシャルデータバンク テックブログ

Discussion