RAG不要!OpenWebUIとOllamaで作るRedmine AIエージェント

この記事はまだ構築して検証確認中です!

最近は「とりあえず全データをベクトルDBへ投入してRAG化」という構成が多いですが、Redmineのようなチケット管理システムでは、

  • チケットが増え続ける
  • コメントが大量に存在する
  • ベクトル化コストが高い
  • 最新情報との同期が必要

という問題があります。(私も何とかDifyで取ってきてRAG化しようと頑張ってみたけどループの制限など色々躓きポイントが多く、チケットが膨大になるとRAG化は厳しいと感じていました)

そこで、

「ナレッジを事前にRAG化するのではなく、LLMにRedmineの検索方法を教え、必要に応じてMCP経由でRedmineを検索させる」

という人間的アプローチはできないかと検索していたところ、なんとMCPでRedmineを操作できるツールを作っておられる方がいらっしゃるではないですか!

MCPを利用することで、RedmineそのものをAIの知識ソース兼業務システムとして利用するAIエージェント としての価値が生まれます。

構成は以下になります。

利用者
 ↓
OpenWebUI
 ↓
Ollama
 ↓Tool Calling
 ↓
Redmine MCP Server
 ↓
Redmine
   ├ チケット
   ├ コメント
   ├ Wiki
   ├ 添付ファイル
   ├ ガントチャート
   └ カスタムフィールド

構築手順

1. Ollama導入

例:※ここは以前の記事を参照下さい

curl -fsSL https://ollama.com/install.sh | sh

モデル取得

ollama pull qwen3:32b

または

ollama pull llama3.3

他にもGemmaなど、GPUの性能など環境にあったモデルを選択下さい。


2. OpenWebUI導入

openwebuiをdocker-composeで立ち上げます。アクセスは http://127.0.0.1:3000/ です。

mkdir -p ~/work/openwebui/data
cd ~/work/openwebui/
vi docker-compose.yml
```yaml
version: "3.9"

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui
    container_name: open-webui
    restart: unless-stopped
    ports:
      - "3000:8080"
    volumes:
      - ./data:/app/backend/data
```

ollamaが同じホストのホストOS上で立ち上げている場合は、以下を追加しておいて下さい。コンテナや別ホストなら以下設定は不要です。

    extra_hosts:
      - "host.docker.internal:host-gateway"


3. Redmine API有効化

Redmineはすでに動作しているものとします。必要な権限があるアカウントのAPIを取得してください。

管理

設定

API

REST APIを有効

APIキー取得

個人設定

APIアクセスキー

4. redmine-mcp-server導入

今回は、「https://github.com/jztan/redmine-mcp-server」を使わせていただきます。

これは、Redmineプロジェクト管理システムと連携するモデルコンテキストプロトコル(MCP)サーバー。このサーバーはMCPツールを介してRedmineデータへのシームレスなアクセスを提供し、AIアシスタントがRedmineインスタンスと連携できるようにします。

特徴

  • 45個のMCPツール(加えて、1つのオペレーターツールは制限付きREDMINE_MCP_EXPOSE_ADMIN_TOOLS=true):課題、プロジェクト、時間追跡、Wiki、ガントチャート、ファイル操作、メンバーシップ管理、製品、連絡先(CRM)、DMSFドキュメントなど
  • 柔軟な認証方式:APIキー、ユーザー名/パスワード、またはOAuth2ユーザーごとのトークン
  • プロンプトインジェクション保護:安全なLLM消費のために境界タグでラップされたユーザー制御コンテンツ
  • 読み取り専用モードREDMINE_MCP_READ_ONLY:環境変数を使用して読み取り専用操作に制限します
  • HTTPファイル配信:UUIDベースのURLによる安全な添付ファイルアクセスと自動有効期限設定
  • ページネーションサポート:設定可能な制限により、大量の結果セットを効率的に処理します。
  • MCP準拠:FastMCPとHTTPトランスポートによる完全なモデルコンテキストプロトコルサポート
  • Docker対応:完全なコンテナ化サポート

クイックスタート

ここでは、予め作成されたDockerイメージを利用します。

githubからリポジトリをダウンロードし、Docker用の設定ファイル[.env.docker]を設定します。

git clone https://github.com/jztan/redmine-mcp-server.git
cd redmine-mcp-server/
cp .env.docker.example .env.docker
vi .env.docker
---
<略>
REDMINE_URL=http://[REDMINEサーバのURL]
#REDMINE_USERNAME=your_username  ← APIを使うのでコメントアウト
#REDMINE_PASSWORD=your_password  ← APIを使うのでコメントアウト
REDMINE_API_KEY=[REDMINEから取得したAPIキー]
REDMINE_AUTH_MODE=legacy
# Server configuration
SERVER_HOST=0.0.0.0
SERVER_PORT=8000
# Public URL configuration for file serving
PUBLIC_HOST=localhost
PUBLIC_PORT=8000
# File management
ATTACHMENTS_DIR=./attachments
# ATTACHMENT_MAX_DOWNLOAD_BYTES=209715200  # get_redmine_attachmentのdownloadは200MB制限
AUTO_CLEANUP_ENABLED=true
CLEANUP_INTERVAL_MINUTES=10
ATTACHMENT_EXPIRES_MINUTES=60
<略>

dockerイメージをビルドして起動します。

docker compose up --build

サーバーが起動すると、http://localhost:8000MCPエンドポイントは/mcp、ヘルスチェックは/health、ファイル配信はでリッスンします/files/{file_id}

http://localhost:8000/health
---
{"status":"ok","service":"redmine_mcp_tools","auth_mode":"legacy","checks":{"redmine":"ok"}}

ひとまず、上記の通り出力されていれば、redmine-mcp-serverはredmineサーバにAPIで接続できています。


MCPツール設計

利用可能なツール

この MCP サーバーは、Redmine と連携するための 45 個のツールを提供します (さらにREDMINE_MCP_EXPOSE_ADMIN_TOOLS=true、によって公開される 1 つのオペレーター ツールと、環境変数でオプトインする 5 つのプラグイン ゲート ツールがあり、すべて有効にすると最大 46 個になります)。詳細なドキュメントについては、ツール リファレンスを参照してください。

コアツール(40種類、常時利用可能)

これらのツールに必要なのは、Redmineのインスタンスと認証情報だけで、追加のプラグインや機能フラグは必要ありません。

  • プロジェクト管理(9つのツール)
  • 問題発生時の操作(13種類のツール)
    • get_redmine_issue- 詳細な問題情報を取得します(ジャーナルのページネーション、ウォッチャー、関連情報、子情報に対応)。
    • list_redmine_issues- 柔軟なフィルタリング機能(プロジェクト、ステータス、担当者など)を使用して課題を一覧表示します。
    • search_redmine_issues- テキストクエリで問題を検索
    • create_redmine_issue- 新しい課題を作成する
    • update_redmine_issue- 既存の問題を更新する
    • delete_redmine_issue- 不可逆的な削除を行う前に、必要な確認フラグと連鎖的な影響のプレビューを表示して、課題を完全に削除します。
    • copy_issue- オプションのフィールドオーバーライドを使用して既存の問題を複製する
    • list_subtasks- 特定の親タスクのサブタスク(子タスク)を一覧表示する
    • get_private_notes- 問題に関する非公開メモを取得する
    • manage_issue_relation- 課題関連のリスト表示、作成、または削除
    • manage_issue_watcher- 課題のウォッチャーを追加または削除する
    • manage_issue_noteジャーナルノートのテキストを編集したり、プライバシー設定を切り替えたりする
    • manage_issue_category- 問題カテゴリの一覧表示、作成、更新、または削除
    • 注:名前でカスタムフィールドget_redmine_issueを含めcustom_fieldsたりupdate_redmine_issue更新したりできます (例{"size": "S"})。
  • 時間管理(4つのツール)
    • list_time_entriesプロジェクト、課題、ユーザー、日付範囲でフィルタリングして時間エントリを一覧表示する
    • manage_time_entry- タイムエントリを作成または更新する(user_id他のユーザーに代わってログを記録する場合に使用)
    • list_time_entry_activities- 時間入力に利用可能なアクティビティの種類を確認する
    • import_time_entries- エントリごとのエラー報告機能を備えた、シーケンシャルなAPI呼び出しによるタイムエントリの一括インポート
  • 発見/列挙(6つのツール):LLMが作成/更新ツールを呼び出す前に有効なIDを見つけるのを支援します
    • list_redmine_trackers- すべてのトラッカー(バグ、機能、サポートなど)を一覧表示します。
    • list_redmine_issue_statuses- すべての課題ステータスとそのis_closedフラグを一覧表示します
    • list_redmine_issue_priorities- すべての優先度レベルを一覧表示します
    • list_redmine_users- ユーザーのフィルタリング/一覧表示(管理者のみ利用可能。名前とグループのフィルタリングに対応)
    • get_current_user- 認証済みユーザーのプロファイルを取得します(管理者以外のユーザーにも有効です)
    • list_redmine_queries- 保存済みのカスタムクエリの一覧表示(読み取り専用)
  • 検索とWiki(2つのツール)
    • search_entire_redmine- 課題とWikiページ全体を対象としたグローバル検索(Redmine 3.3.0以降)
    • manage_redmine_wiki_page- Wikiページの一覧表示、取得、作成、更新、削除、または名前変更
  • ファイル操作(4つのツール)
    • list_filesプロジェクトのファイルセクションにアップロードされたファイルを一覧表示する
    • upload_file- プロジェクトに新しいファイル(base64 コンテンツ)をアップロードします。必要に応じてバージョンに紐付けます。
    • delete_fileプロジェクトからファイルを削除する
    • get_redmine_attachment- 添付ファイルをダウンロードする(HTTPモードとstdioモードの両方で動作します)
  • ガントチャート(ツール1つ)
    • get_gantt_chart- プロジェクトのタイムラインデータを取得する:日付、依存関係、マイルストーンに関する問題
  • メタ(1ツール)
    • get_mcp_server_info- サーバーのバージョン、認証モード、読み取り専用状態、認証されたユーザー ( current_user)、およびどのプラグインゲートツールファミリーが有効になっているかを報告します。最近リリースされた修正に依存する前にデプロイメントの遅延を検出したり、assigned_to_id="me"が に解決されることを確認したりするために使用します。

この他、Redmineにプラグインを入れることで利用できる機能があります。詳細はGitHubのREADMEをご確認下さい。


OpenWebUIへMCP登録

管理画面

Admin

Tools

MCP

登録

redmine-mcp-server

システムプロンプト

ここが重要です。

あなたはRedmineのナレッジ検索アシスタントです。

質問に回答する前に、
必要に応じてRedmineを検索してください。

検索結果から
・発生原因
・対応内容
・関連チケット
を整理して回答してください。

推測ではなくRedmineの内容を優先してください。

動作例

利用者

VPN接続が失敗する場合の対応方法を教えて

LLM

VPN

search_issues()

MCP

#123
#456
#789

LLM

get_issue(123)
get_issue(456)

回答

過去の障害事例では

・証明書期限切れ
・FWポリシー変更
・DNS設定誤り

が主な原因でした。

特にチケット#456では
証明書更新で復旧しています。

この方式の最大の利点

RAGの場合

検索

類似文書

回答

になります。

MCPの場合

検索

詳細取得

追加検索

分析

回答

になります。

つまり

「AIがRedmineを操作して調査する」

という人間の保守担当者に近い動きになります。

Redmineのように「チケット」「コメント」「添付ファイル」「履歴」が蓄積される運用システムでは、RAGよりもMCPの方が自然に機能するケースが多いようです。

タイトルとURLをコピーしました