😺

Backlogと連携するMCPサーバーを自作して、日報やタスク管理を半自動化した話

に公開

みなさん日報や日毎、週ごとのタスク管理ってどうされていますか?

Stripeからデジタルキューブに戻って地味に苦戦しているのが、「今日・昨日何やったっけ?」問題です。BizDevポジションは新しく作られた役職でもあり、また前回開発者として在籍していた頃の経験ベースでの開発支援なども行うことが多い関係上、1日に5-10個のBacklogプロジェクトを横断してタスクを処理しています。また、アプリケーションのテストや過去の対応履歴の確認なども行なっていると、どのチケットを処理して、どのチケットは見ただけかなどの判別がだんだん難しくなってきます。

日報を書く際「これくらいでいいか」という判断でレポートを切り上げるようかと頭をよぎりだしたので、あまり良くない兆候を打破するため、生成AIにぶん投げることにしました。

なぜ生成AIとBacklogの連携が有効なのか

日報作成や今日のタスク確認は多くの開発者にとって日常的な業務ですが、これを手動で行うのは時間がかかり、本来の開発業務から時間を奪ってしまいます。Backlogには既に私たちの業務情報が集約されているため、APIを活用して「今日コメントやステータス変更した課題のリスト」を自動取得できれば、日報作成の手間を大幅に削減できます。

MCPを活用する利点は以下の点にあります:

  1. 自然言語による対話的な操作が可能
  2. 柔軟なデータの取得と整形
  3. 既存のAIアシスタントとシームレスに連携可能
  4. カスタマイズ性の高さ

作ったもの

Backlog上にあるデータを収集するのにフォーカスしたMCP Serverを実装しました。課題作成やコメントなどの操作系を完全に切り捨てて、代わりに日報や自分・メンバーのアクティビティを追跡するために必要なAPI重点的にサポートしています。

https://github.com/digitalcube/advanced-backlog-mcp-server

https://github.com/digitalcube/advanced-backlog-mcp-server/blob/main/README_ja.md

v0.0.1で対応しているツール

  • list_backlog_space - Backlogスペースに関する情報を取得
  • list_backlog_projects - Backlogスペース内のすべてのプロジェクトを一覧表示
  • list_backlog_recently_viewed_issues - 最近表示された課題を一覧表示
  • search_backlog_issues - 様々なフィルターで課題を検索
  • get_backlog_issue - 特定の課題の詳細を取得
  • list_backlog_recently_viewed_projects - 最近表示されたプロジェクトを一覧表示
  • get_backlog_project - 特定のプロジェクトの詳細を取得
  • list_backlog_recently_viewed_wikis - 最近表示されたWikiを一覧表示
  • get_backlog_wiki - 特定のWikiの詳細を取得
  • list_backlog_recent_user_activities - 特定のユーザーのアクティビティを一覧表示
  • get_backlog_current_user - 現在のユーザーに関する情報を取得
  • get_backlog_user - 特定のユーザーに関する情報を取得
  • list_backlog_users - Backlogスペース内のすべてのユーザーを一覧表示
  • list_backlog_own_notifications - 現在のユーザーの通知を一覧表示

MCPサーバーを自作する

すでに公開されているMCPサーバーはいくつかありましたが、流石にアクティビティ系までサポートしているものは見つかりませんでした。それもあってフル自作しています。

必要なツールとアカウント

手慣れているのがTypeScriptですので、そちらで開発を進めます。まず、MCPサーバー構築に必要なセットアップを行います。MCPの公式からフォークしたcreate-mcp-toolsを使うことで、開発の初期段階を迅速に進められます。

https://www.npmjs.com/package/create-mcp-tools

npm create mcp-tools backlog

セットアップ時に以下の質問に答えてください:

  • サーバー名: backlog
  • 説明: LGTM backlog MCP server
  • Claude.appへのインストール: Yes
  • npm installの実行: Yes
  • Gitリポジトリの初期化: Yes

次に、Backlog APIと連携するために必要なパッケージをインストールします。インストールするライブラリについては、backlog-jsのドキュメントに従って追加しました。

cd backlog
npm i isomorphic-form-data isomorphic-fetch backlog-js

機能設計と実装方針

日報自動生成を実現するために、MCPサーバーには以下の機能を実装することにしました:

  1. ユーザー情報の取得: 現在のユーザー情報を取得してアクティビティ検索に利用
  2. ユーザーアクティビティの取得: 今日自分が行った活動の一覧を取得
  3. 通知情報の取得: 未読や重要な通知を確認
  4. プロジェクト情報の取得: 関連するプロジェクト情報の取得
  5. 課題詳細の取得: 特定の課題の詳細情報を取得

これらの機能を組み合わせることで、「今日何をしたか」「要対応の通知はあるか」「プロジェクト全体の状況」などをAIアシスタントとの対話で簡単に確認できるようになります。

実装のポイント

Backlog MCPサーバーを実装する際の重要なポイントをいくつか紹介します:

1. BacklogのAPIクライアント設定

Backlog APIを利用するには、スペースのホスト名とAPIキーが必要です。環境変数として登録していますが、dotenvなどは利用せず、MCPの設定ファイル側に値を設定することに注意しましょう。

const backlog = new backlogjs.Backlog({
    host: process.env.BACKLOG_DOMAIN as string,
    apiKey: process.env.BACKLOG_API_KEY as string
});

Claude Desktopですと、APIキーなどはclaude_desktop_config.jsonに記載します。

{
  "mcpServers": {
    "advanced-backlog-mcp-server": {
      "command": "/path/to/advanced-backlog-mcp-server/build/index.js",
      "env": {
        "BACKLOG_DOMAIN": "your-domain.backlog.com",
        "BACKLOG_API_KEY": "your-api-key"
      }
    }
  }
}

2. ユーザーアクティビティ取得の実装

日報作成で最も重要なのは「今日自分が何をしたか」を把握することです。list_backlog_recent_user_activitiesツールを実装することで、特定ユーザーの活動履歴を取得できます。

server.tool("list_backlog_recent_user_activities",
  {
    userId: z.number().describe("User id"),
    activityTypeId: z.array(z.number()).optional().describe("Activity type id"),
    minId: z.number().optional().describe("Min id"),
    maxId: z.number().optional().describe("Max id"),
    count: z.number().optional().describe("Count"),
    order: z.enum(["asc", "desc"]).optional().describe("Order"),
  },
  async ({userId, ...params}: { userId: number, activityTypeId?: number[], minId?: number, maxId?: number, count?: number, order?: "asc" | "desc" }) => {
    const backlogUserId = userId < 1 ? await backlog.getMyself().then(myself => myself.id) : userId;
    const recentUserActivities = await backlog.getUserActivities(backlogUserId, params);
    return {
      content: [{
        type: "text",
        text: JSON.stringify(recentUserActivities)
      }]
    } 
  }
);

ユーザーIDをチャットで明示することはまずないため、値が存在しない(体験上0で送られてくる)場合はgetMyself()を利用してAPIキーを発行したユーザー自身のIDを取得しています。

3. 出力データの整形はしない

MCPサーバーの作り方として、出力データは2種類の考え方ができます。1つ目はAPIのレスポンスをそのまま返し、生成AI側に処理を委ねるパターン。オフィシャルのMCPサーバーは十中八九この実装を採用しています。もう1つの考え方はユースケースに合わせて不要なデータを削ぎ落としたり、整形したりする方法です。これによって生成AIが考える量を減らしたり、消費するコンテキストウィンドウを節約できます。

今回は、「まず作って後で改善する」開発方針を選んだ・・・というよりは、早くこのツールを使って報告作業を半自動化したかったため、前者のAPIレスポンスをそのまま返す方法を選択しています。将来的にデータの整形や複数のAPIを事前にマッシュアップしたツールを作りたくなることがあるかもしれませんが、不具合・不都合が生まれるまではこの方向でいこうと思います。

活用例

このMCPサーバーを活用することで、以下のような対話が可能になります:

  • 「今日の日報を作りたい。Backlogで今日のアクティビティについてレポートして」
  • 「Backlogで通知きてる?」
  • 「今週のBacklog上のプロジェクト進捗を教えて」

指示のポイントとしては、「Backlogの」と明確に指示を出すことでしょうか。MCPを使われている方は、他にもPlaywrightやStripe / AWSなどさまざまなサーバーと併用していることがあります。そのため、意図しないサービスの情報を参照させないためにも、できるだけ参照してほしいサービス名は明記することをお勧めします。

これにより、コマンドベースのインターフェースではなく、自然な対話形式で業務情報を取得できるようになります。

まとめ

BacklogとMCPを連携した日報自動生成ツールは、日々の業務効率化に大きく貢献します。APIを活用して自分の活動履歴を自動取得し、AIアシスタントと対話形式で情報を整理できるため、日報作成の手間を削減できることを期待しています。

最後に、このツールはあくまでも効率化のためのものであり、コミュニケーションの質を高めることが本当の目的です。自動化によって生まれた時間を、より創造的な業務やチームとのコミュニケーションに活かしていただければ幸いです。

デジタルキューブ

Discussion