ドキュメントやファイルが見れる非公式Backlog MCPサーバーをRustで作りました

MCP (Model Context Protocol) とは、AIを使ったアプリケーションにある特定の機能を与える仕組みです (詳しくは以前の記事を参照してください)。例えば、Backlog の MCPサーバーを使うことで、AIアプリケーションから、Backlog上の課題の内容を取得したり、課題を作成したりすることができます。

今回私が作った非公式MCPサーバーでは、Backlog の公式 MCPサーバーにはないドキュメントの取得や添付ファイルの取得などをAIアプリケーションから行うことができるようになっています。これを使うことで、AIアプリケーションからBacklog上のドキュメントの情報を取得したり、課題の画像ファイルを参照したりすることができます。

Rust版の特徴

現在の公式版とRust版を比べたとき、Rust版だけにある機能は次の通りです。実際にどういうツールがあるのかはReadmeを参照してください。また、Rust版はシングルバイナリで動作するため、導入が比較的楽なのではないかと思います。

  • ドキュメントの取得

  • 共有ファイルの取得

  • 課題、ドキュメント、Wiki、PRにある添付ファイルの取得

  • 環境変数BACKLOG_PROJECTSによる特定プロジェクトへの限定アクセス機能

  • コンパイル時のフィーチャーフラグによる書き込み権限の制御

逆に公式版にあるがRust版にはない機能は次の通りです。これらは利用機会が少ないと判断して実装していません。

  • 通知管理

  • ウォッチリスト管理

  • カテゴリ管理

  • スペース情報取得

  • ユーザー自身の情報取得

導入手順

GitHubのリリースページに各プラットフォームごとのバイナリが用意されています。使っているプラットフォームの mcp-backlog-server の圧縮ファイルをダウンロードして解凍してください。macOSではbrewを利用して導入することもできます。

その後、利用するAIアプリケーションに応じて設定を追加してください。例えばGemini CLIなら、~/.gemini/settings.json に次のように書きます。

{
  "mcpServers": {
    "backlog_mcp_server": {
      "command": "/path/to/mcp-backlog-server",
      "timeout": 10000,
      "args": [],
      "env": {
        "BACKLOG_BASE_URL": "https://your-space.backlog.com",
        "BACKLOG_API_KEY": "YOUR_BACKLOG_API_KEY",
        "BACKLOG_PROJECTS": "PROJ,DEMO"
      }
    }
  }
}

“backlog_mcp_server” の名前は好きに変えることができますが、Backlogというキーワードを含めておいたほうがAIアプリケーション側で認識しやすくなるはずです。また、BACKLOG_BASE_URLなどは、ユーザーごとに変わりますので、お手数ですがご自身で設定してください。

  • BACKLOG_BASE_URL にはお使いのスペースのURLを参照してください。backlog.com ではなく backlog.jp である場合があります

  • BACKLOG_API_KEY にはBacklog APIキー (https://support-ja.backlog.com/hc/ja/articles/360035641754) を入れてください

  • BACKLOG_PROJECTS はオプションです。AIエージェントに操作させる対象のプロジェクトをカンマ区切りで指定してください。BACKLOG_PROJECTS自体が存在しない、もしくは存在しても空文字のときは、APIキーを発行しているユーザーが見ることができるすべてのプロジェクトの操作ができるようになります。AIエージェントによっては事前に機能を利用する許可を求めてくることもあるので、その機能でこの設定の代用することもできるでしょう

実際の使い方

設定した後はAIアプリケーションを再起動し、MCPサーバーが認識されているかを確認してください。例えばClaude DesktopではSearch and Toolsボタンから確認することができます。

確認できた後はプロンプトなどで「Backlog の MCP サーバーで」のような言葉を入れると、AIアプリケーションが認識して使うようになるはずです。

一例として、私がClineに対して出している実際に業務で使っているプロンプトの一部を次に示します。

# 指示: 次のBacklogの課題の内容に従ってコードを修正するための実行プランを作ってください

- [課題キーと課題タイトル]

下記のドキュメントをもとに、実行プランを作ってください

- 内部仕様書: [BacklogドキュメントのURL]

## 注意事項

- Backlogの課題やドキュメントは Backlog の MCP サーバーで最初に読み込んでください

開発者向けソースコード解説

今回のMCPサーバーでは、途中からClineやClaude Codeを使って書いています。これらを使った開発についての詳細はまた別に機会に譲るとして、今回は次のような点を意識して作りました。

Model Context Protocolの公式SDKを使う

RustでMCPサーバーやクライアントを使うには、公式のRust SDK (rmcp) を使うのがよいでしょう。今回はその最新版である 0.2.1 を使いました。rmcp 0.2.1の内部ではschemars 0.8を使っていたのでそれに合わせる必要がありました (現在のmainブランチではschemars 1.0を使うようになっています)。

それ以外に使う外部クレートもreqwest, tokio, serde, thiserror, chrono, regex, derive_builder, schemars といった有名どころを使うようにしています。

ワークスペースを使い、クレートをAPIの機能ごとに細かく分ける

Cargoのワークスペース機能を利用して、crates ディレクトリ内にサブcrateを入れる構成にしました。これは、Rust AnalyzerWasmtime などのディレクトリ構成をを参考にしています。

クレートは大雑把には次のような構成になっています。少しcrateを分けすぎな気もしますが、必要なcrateだけ入れることでバイナリサイズの削減はできるはずです。crate同士の整理がきちんとされていないのでそこはまだ改善の余地があると思います。

また、workspace.dependencies を使って、共通で使うクレートはワークスペースで管理するようにしています。

APIではfeature flagsで機能を指定できるようにする

APIの機能に関しては、feature flagsを使って、特定の機能だけ使えるようにしました。例えば --features=issue,issue_writable で課題の読み書きができるようになる、といったことです。APIの部分を使ったアプリを今後つくることを考えたときに、そのアプリに必要な機能だけ取り出せるとよいのではないかというのが理由です。

thiserrorとFromを使ってエラーをハンドリングする

Effective Rustに書かれているような手法を使っています。backlog-coreとbacklog-api-coreでエラーを定義した上で、backlog-mcp-serverにもエラーを定義し、backlog-coreとbacklog-api-coreのエラーはFrom を使って変換させることで、? で From を使ったエラー型の自動変換を行わせています。thiserrorでエラーメッセージを楽に書けるようにしています

おわりに

本記事では、Rustで実装した非公式Backlog MCPサーバーについて解説しました。このサーバーは、公式版にはないドキュメントや添付ファイルの取得機能を提供していますので、これを使ってBacklogと連携したAIによる新しいワークフローの効率化を試してみてください。

 

開発メンバー募集中

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる