SRWS-PSG
MCP Server
SRWS-PSG
public

meta analysis bot release

一个通过Slack接收CSV文件并使用Gemini AI和R进行元分析的自动化工具。

Repository Info

0
Stars
0
Forks
0
Watchers
0
Issues
Python
Language
MIT License
License

About This Server

一个通过Slack接收CSV文件并使用Gemini AI和R进行元分析的自动化工具。

Model Context Protocol (MCP) - This server can be integrated with AI applications to provide additional context and capabilities, enabling enhanced AI interactions and functionality.

Documentation

# メタ解析Slack Bot

Slackで共有されたCSVファイルからメタ解析を実行し、学術論文形式のレポートを返すボットです。
Google Gemini AIによる自然言語対話で解析パラメータを収集し、R(metafor)を使用してpairwise meta-analysis、サブグループ解析、メタ回帰分析を実行します。
現状はpairwise meta-analysisのみに対応しています。

## 概要

このボットはSlackでアップロードされたCSVファイルを監視し、Gemini APIによる自然言語理解でCSV構造分析、メタ解析への適合性評価、列の役割マッピングを行います。ユーザーとの自然な日本語対話を通じてパラメータを収集し、`templates/r_templates.py`の`RTemplateGenerator`を用いてRスクリプトを動的に生成、Rのmetaforパッケージでメタ解析を実行します。最終的に、プロット(フォレスト・ファンネル・バブル)、Rコード、RDataファイル、およびGemini APIによるテキストレポート(Statistical Analysis・Resultsセクション)をSlackに返します。

## 使用方法

### 起動条件
- **メンション+CSVファイル添付**: ボットが存在するSlackチャンネルでCSVファイルを共有し、@ボットでメンション
- **メンション+CSVデータ(コードブロック)**: メンション付きメッセージ内にCSVデータをコードブロックで投稿
- **メンションのみ**: CSVファイル共有を依頼するメッセージが表示される

### 解析フロー
1. **CSV自動分析**: ボットがアップロードされたCSVを分析し、データ構造と効果量候補を検出
2. **自然言語パラメータ収集**: Gemini AIが日本語で対話しながら解析パラメータを収集(効果量、モデル、サブグループなど)
3. **メタ解析実行**: Rのmetaforパッケージを使用して非同期でメタ解析を実行
4. **結果返却**: フォレストプロット、Rコード、RDataファイル、学術論文形式のレポートをスレッド内に投稿

### 対話例
```
ユーザー: @bot [CSVファイル添付] オッズ比で解析してください
ボット: CSVファイルを分析しました!データセット概要:...
       解析パラメータを自然な日本語で教えてください
ユーザー: @bot ランダム効果モデルで、地域別のサブグループ解析もお願いします
ボット: 承知しました!解析を開始します...
       [解析完了後] フォレストプロット、Rコード、学術レポートを添付
```

## 動作モード

このボットは2つの動作モードに対応しています:

### Socket Mode(ローカル開発推奨)
- **WebSocket接続**でSlackと通信
- ファイアウォール内での動作が可能
- 設定が簡単(Event SubscriptionsのURL設定不要)
- 長時間接続を維持

### HTTP Mode(Herokuデプロイ推奨)
- **HTTPエンドポイント**でSlackと通信
- Heroku Eco dynosなどのサーバー環境に最適
- 高いスケーラビリティ
- Event SubscriptionsのURL設定が必要

動作モードは環境変数`SOCKET_MODE`で制御できます(`true`: Socket Mode (ローカル開発時), `false`または未設定: HTTP Mode (Herokuデプロイ時))。

## プロジェクト構成

```
.
├── main.py                 # エントリーポイント
├── requirements.txt        # Python依存関係
├── init.R                  # R初期化スクリプト
├── Dockerfile             # Docker設定(ローカル開発用)
├── Procfile               # Heroku設定
├── README.md              # プロジェクト概要(本ファイル)
├── CLAUDE.md              # Claude AI開発ガイドライン
├── LICENSE                # ライセンス情報
│
├── core/                  # コア機能
│   ├── gemini_client.py   # Gemini API統合
│   ├── metadata_manager.py # メタデータ管理
│   └── r_executor.py      # R実行エンジン
│
├── handlers/              # Slackイベントハンドラー
│   ├── analysis_handler.py
│   ├── csv_handler.py
│   ├── mention_handler.py
│   ├── parameter_handler.py
│   └── report_handler.py
│
├── mcp_legacy/            # レガシー実装(移行中)
│   ├── slack_bot.py       # メインボットロジック
│   ├── gemini_utils.py    # Gemini統合ユーティリティ
│   └── ...
│
├── utils/                 # ユーティリティ
│   ├── conversation_state.py
│   ├── gemini_dialogue.py
│   └── slack_utils.py
│
├── templates/             # Rテンプレート
│   └── r_templates.py
│
├── docs/                  # 追加ドキュメント
│   ├── DEBUG_SLACK_BOT.md
│   ├── REDIS_SETUP.md
│   └── TEST_PLAN.md
│
├── scripts/               # ユーティリティスクリプト
│   ├── add_redis.sh
│   ├── add_redis_direct.sh
│   └── install_heroku_wsl.sh
│
├── tests/                 # テストスイート
│   ├── test_slack_upload.py
│   ├── test_gemini.py
│   └── ...
│
└── examples/              # サンプルCSVファイル
    ├── example_binary_meta_dataset.csv
    └── ...
```

## 機能

### コア機能
- ✅ **CSV自動分析**: Gemini AIによるデータ構造分析、適合性評価、列の自動マッピング
- ✅ **自然言語対話**: 日本語でのパラメータ収集、文脈理解、適切な質問生成
- ✅ **多様な効果量対応**: OR, RR, RD, HR, SMD, MD, PLO, IR, COR, 事前計算済み効果量
- ✅ **OR/CI自動変換**: オッズ比・リスク比と信頼区間から対数スケールへの自動変換(新機能)
- ✅ **ゼロセル対応**: Mantel-Haenszel法による補正なし解析、自動感度解析(新機能)
- ✅ **高度な解析機能**: サブグループ解析、メタ回帰、感度分析
- ✅ **学術レポート生成**: 英語論文形式(Statistical Analysis・Resultsセクション)+ 日本語併記

### 技術機能
- ✅ **非同期処理**: Slack 3秒タイムアウト対応、バックグラウンド解析実行
- ✅ **エラー処理**: Gemini AIによるRスクリプト自動デバッグ(最大3回リトライ)
- ✅ **プロット生成**: 動的サイズ調整、Events/Total表示、合計行付きフォレストプロット
- ✅ **ファイル出力**: Rスクリプト、フォレスト/ファンネル/バブルプロット、RDataファイル
- ✅ **スレッド対話**: 会話コンテキスト維持、メンション必須、状態管理

### 対応データ形式
- **二値アウトカム**: イベント数/総数(OR, RR, RD, PETO)
- **OR/RRと信頼区間**: 自動的にlnOR/lnRRとSEに変換(新機能)
- **連続アウトカム**: 平均値/標準偏差/サンプルサイズ(SMD, MD, ROM)
- **ハザード比**: ログ変換済みデータの自動検出
- **単一群比率**: イベント数/総数(PLO, PR, PAS, PFT, PRAW)
- **発生率**: イベント数/観察時間(IR, IRLN, IRS, IRFT)
- **相関**: 相関係数/サンプルサイズ(COR)
- **事前計算済み**: 効果量yi/分散vi

## アーキテクチャ

システムは以下の主要コンポーネントで構成されています:

### 1. エントリーポイント
- **main.py**: Socket Mode/HTTP Modeの選択、Slack Boltアプリケーション起動

### 2. コアモジュール (core/)
- **gemini_client.py**: Gemini API統合クライアント、CSV分析・パラメータ抽出・レポート生成
- **metadata_manager.py**: Slackメッセージメタデータの管理とペイロード処理
- **r_executor.py**: R実行エンジン、metaforによるメタ解析実行、エラーハンドリング

### 3. イベントハンドラー (handlers/)
- **mention_handler.py**: @ボットメンション処理、CSV検出、状態振り分け
- **csv_handler.py**: CSVファイル分析、Gemini APIによる適合性評価
- **parameter_handler.py**: 自然言語パラメータ収集、Gemini対話管理
- **analysis_handler.py**: メタ解析実行、結果ファイルアップロード
- **report_handler.py**: 学術レポート生成、Gemini解釈処理

### 4. テンプレート管理 (templates/)
- **r_templates.py**: RTemplateGenerator、動的Rスクリプト生成、プロット管理

### 5. ユーティリティ (utils/)
- **conversation_state.py**: 会話状態管理、Redis/メモリストレージ、対話フロー制御
- **slack_utils.py**: Slackメッセージ生成、ファイルアップロード、UI作成
- **file_utils.py**: ファイル管理、一時ディレクトリ操作、ダウンロード処理
- **parameter_extraction.py**: パラメータ抽出ロジック
- **gemini_dialogue.py**: Gemini対話管理(レガシー)

### 6. データフロー
```
CSV添付+メンション → mention_handler → csv_handler → Gemini分析
                                      ↓
parameter_handler ← Gemini対話 ← ユーザー応答検出
         ↓
analysis_handler → R実行 → プロット生成 → ファイルアップロード
         ↓
report_handler → Gemini解釈 → 学術レポート → Slack投稿
```

## 要件

- Python 3.12+
- metaforパッケージを含むR
- Slack API認証情報
- Google Gemini API Key

## セットアップ

### 1. 前提条件

- **Python 3.12+** がインストールされていること
- **R (4.0+)** とmetaforパッケージがインストールされていること  
- **Git** がインストールされていること
- **Heroku CLI** がインストールされていること(デプロイ時)

### 2. ローカル環境セットアップ

#### a. リポジトリのクローン
```bash
git clone https://github.com/your-username/meta-analysis-bot-release.git
cd meta-analysis-bot-release
```

#### b. Python依存関係のインストール
```bash
pip install -r requirements.txt
```

#### c. R環境のセットアップ
Rとmetaforパッケージが必要です:
```r
# Rコンソールで実行
install.packages("metafor")
install.packages("jsonlite")
```

#### d. 環境変数の設定
プロジェクトルートに`.env`ファイルを作成し、必要な環境変数を設定します:

```bash
# .envファイル例
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_SIGNING_SECRET=your-signing-secret
GEMINI_API_KEY=your-gemini-api-key
SOCKET_MODE=true  # ローカル開発時
SLACK_APP_TOKEN=xapp-your-app-token  # Socket Mode使用時

# テスト用環境変数(テスト実行時に必要)
SLACK_UPLOAD_BOT_TOKEN=xoxb-test-messenger-token
SLACK_UPLOAD_CHANNEL_ID=C123456789  # テスト用チャンネルID
META_ANALYSIS_BOT_ID=U123456789     # メタ解析ボットのユーザーID
```

### 3. Slack Botの設定

Slack Botをセットアップするには、以下の手順に従ってください。

1. **Slack Appの作成:**
   - Slack APIのウェブサイト ([https://api.slack.com/apps](https://api.slack.com/apps)) にアクセスします
   - 「Create New App」をクリックし、「From scratch」を選択します
   - アプリ名(例: `MetaAnalysisBot`)と、ボットを開発・テストするSlackワークスペースを指定し、「Create App」をクリックします

2. **必要な権限 (Scopes) の設定:**
   - 作成したアプリの管理画面に移動し、左側のナビゲーションから「OAuth & Permissions」を選択します
   - 「Bot Token Scopes」セクションまでスクロールし、「Add an OAuth Scope」をクリックして以下の権限を追加します
     - `app_mentions:read`
     - `channels:history`
     - `chat:write`
     - `files:read`
     - `groups:history`
     - `im:history`
     - `mpim:history`
     - `users:read`

3. **Bot User OAuth Tokenの取得とインストール:**
   - 「OAuth & Permissions」ページの上部にある「Install to Workspace」ボタンをクリックし、アプリをワークスペースにインストールします
   - インストールが完了すると、「Bot User OAuth Token」が表示されます(`xoxb-...`で始まる文字列)
   - このトークンをコピーし、ローカル開発時は`.env`ファイルの`SLACK_BOT_TOKEN`に、Herokuデプロイ時はConfig Varsに設定します

4. **Signing Secretの取得:**
   - アプリ管理画面の左側のナビゲーションから「Basic Information」を選択します
   - 「App Credentials」セクションまでスクロールし、「Signing Secret」の横にある「Show」をクリックして表示されるシークレットをコピーします
   - これをローカル開発時は`.env`ファイルの`SLACK_SIGNING_SECRET`に、Herokuデプロイ時はConfig Varsに設定します

5. **Socket Modeの設定 (ローカル開発時):**
   - ローカル開発でSocket Modeを使用する場合、アプリ管理画面の左側のナビゲーションから「Socket Mode」を選択し、「Enable Socket Mode」をオンにします
   - 「App-Level Tokens」セクションで「Generate an app-level token and add scopes」をクリックします
   - トークン名を入力し、「connections:write」スコープを追加して「Generate」をクリックします
   - 生成されたトークン(`xapp-...`で始まる文字列)をコピーし、`.env`ファイルの`SLACK_APP_TOKEN`に設定します
   - `.env`ファイルで`SOCKET_MODE=true`に設定します
   - **Herokuデプロイ時はHTTP Mode (`SOCKET_MODE=false`または未設定) を使用するため、この設定は不要です**

6. **Event Subscriptionsの設定 (HTTPモードの場合):**
   - HerokuにデプロイしてHTTP Mode (`SOCKET_MODE=false`または未設定) を使用する場合、Slack Appの管理画面でEvent Subscriptionsの設定が必要です
   - アプリ管理画面の左側のナビゲーションから「Event Subscriptions」を選択し、「Enable Events」をオンにします
   - 「Request URL」に、HerokuアプリケーションのイベントエンドポイントURLを設定します。これは通常、 `https://<YOUR_HEROKU_APP_NAME>.herokuapp.com/slack/events` という形式になります
   - 「Subscribe to bot events」セクションで、ボットが購読するイベント(例: `app_mention`, `message.channels`, `file_shared`など)を追加します

### 4. ローカル環境での実行

環境変数を設定した後、以下のコマンドでボットを起動できます:

```bash
# 直接実行
python main.py

# または環境変数を指定して実行
SOCKET_MODE=true python main.py
```

Socket Modeを使用する場合、ボットは自動的にSlackに接続し、メンションやファイル共有イベントを監視します。

### 5. Herokuへのデプロイ

このアプリケーションはHerokuのEco Dynosプランでの運用を想定しています。

#### 5.1. Heroku側の準備

1. **Eco Dynosプランへの加入**:
   - Herokuダッシュボードの Account → Billing → Eco Dynos から加入します (月$5で1000 dyno-hours)

2. **アプリの新規作成**:
   - Herokuダッシュボードで新しいアプリを作成し、アプリ名 (`HEROKU_APP_NAME`) を控えます

3. **API Keyの発行**:
   - Account → API Key からAPIキーを発行し、コピーしておきます(GitHub ActionsのSecret用)

4. **Config Varsの登録**:
   - 作成したアプリの Settings → Config Vars で、以下の環境変数を設定します
     - `SLACK_BOT_TOKEN`
     - `SLACK_SIGNING_SECRET`
     - `GEMINI_API_KEY`
     - `SOCKET_MODE=false` (または未設定)
     - `STORAGE_BACKEND=memory`
     - その他必要なAPIキーなど

#### 5.2. GitHub側の準備

1. **Secretsの登録**:
   - リポジトリの Settings → Secrets and variables → Actions で、以下のリポジトリシークレットを登録します
     - `HEROKU_API_KEY`: HerokuのAPIキー
     - `HEROKU_APP_NAME`: Herokuアプリ名

2. **Secret Scanning & Push Protectionの有効化**:
   - リポジトリの Settings → Code security and analysis で有効化します

#### 5.3. デプロイの実行

変更をGitHubにプッシュし、`main`ブランチにマージすると、GitHub Actionsが起動し、Herokuへのデプロイが実行されます。

### 6. Herokuでの運用 (低アクセス想定)

- **スリープ仕様**: Eco dynoは30分間通信がないと自動的にスリープします。再度アクセスがあると約5~10秒で再起動します
- **Dyno Hoursの確認**: `heroku ps -a YOUR_HEROKU_APP_NAME`でdynoの状態や使用時間を確認できます
- **ログ確認**: `heroku logs --tail -a YOUR_HEROKU_APP_NAME`でリアルタイムログを確認できます
- **コード更新**: ローカルでコードを修正し、コミットしてGitHubにプッシュすると、GitHub Actionsが自動的に再デプロイします

## 主要な環境変数

### 必須変数

- `SLACK_BOT_TOKEN`: Slackボットのトークン
- `SLACK_SIGNING_SECRET`: Slackアプリの署名シークレット
- `GEMINI_API_KEY`: Gemini APIキー

### オプション変数

- `SOCKET_MODE`: Socket Modeの有効化 (true/false、デフォルト: false)
- `SLACK_APP_TOKEN`: Socket Mode使用時のアプリレベルトークン
- `STORAGE_BACKEND`: ストレージバックエンド (memory、デフォルト: memory)
- `GEMINI_MODEL_NAME`: 使用するGeminiモデル (デフォルト: gemini-1.5-flash)
- `MAX_HISTORY_LENGTH`: 会話履歴の最大保持件数 (デフォルト: 20)
- `R_EXECUTABLE_PATH`: Rscriptの実行パス (Dockerコンテナ内では通常不要)
- `PORT`: HTTPモード時のポート番号 (Herokuが自動設定)

## テスト・デバッグ

### 対話テスト方法

`tests/`ディレクトリには包括的なテストツールが用意されています。

**注意**: テストコマンドの`YOUR_BOT_ID`は、実際のボットのSlack User IDに置き換えてください。Slack APIの`auth.test`やボットのプロフィールから確認できます。

#### 1. 基本的な対話テスト
```bash
cd tests/
# Step 1: CSVファイル+メンションを投稿(test-messengerボット使用)
python3 test_slack_upload.py --bot-id YOUR_BOT_ID --example binary --message "オッズ比で解析してください"

# Step 2: ボットの応答確認
python3 debug_channel_messages.py

# Step 3: ユーザー応答をシミュレート(スレッド内でメンション必須)
python3 send_message.py --message "<@YOUR_BOT_ID> はい、ランダム効果モデルでお願いします" --thread "THREAD_TS"

# Step 4: 最終結果確認
python3 debug_channel_messages.py
```

#### 2. 異なる解析タイプのテスト
```bash
# 連続アウトカムデータ
python3 test_slack_upload.py --bot-id YOUR_BOT_ID --example continuous --message "標準化平均差で解析してください"

# 比率データ
python3 test_slack_upload.py --bot-id YOUR_BOT_ID --example proportion --message "比率データの解析をお願いします"

# ハザード比データ
python3 test_slack_upload.py --bot-id YOUR_BOT_ID --example hazard_ratio --message "ハザード比で解析してください"

# ゼロセルデータ(Mantel-Haenszel法のテスト)
python3 test_slack_upload.py --bot-id YOUR_BOT_ID --example zero_cells --message "ゼロセルがあるデータでMantel-Haenszel法をお願いします"
```

#### 3. バージョン情報テスト
```bash
# R version、metafor versionの表示確認
python3 test_version_info_debug.py
```

### デバッグ手順

#### Herokuログ確認
```bash
# リアルタイムログ
heroku logs --tail --app=meta-analysis-bot

# エラーログのみ
heroku logs --app=meta-analysis-bot | grep -E "(ERROR|Exception|Failed)"

# 特定時間のログ
heroku logs --since "2024-01-01T00:00:00Z" --until "2024-01-01T01:00:00Z" --app=meta-analysis-bot
```

#### 起動条件の確認
- ✅ **メンション+CSVファイル添付**: ボット起動、CSV分析開始
- ✅ **メンション+CSVコードブロック**: ボット起動、CSV分析開始  
- ✅ **メンションのみ**: ボット起動、CSV共有依頼
- ❌ **CSV共有のみ(メンションなし)**: ボット起動しない(仕様通り)

詳細な使用方法は`tests/README.md`を参照してください。

## 謝辞

本プロジェクトは、JSPS科研費 25K13585「大規模言語モデルが加速するエビデンスの統合」の助成を受けて開発されました。
- 研究課題番号: 25K13585
- 研究課題詳細: https://kaken.nii.ac.jp/ja/grant/KAKENHI-PROJECT-25K13585/

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

Quick Start

1

Clone the repository

git clone https://github.com/SRWS-PSG/meta-analysis-bot-release
2

Install dependencies

cd meta-analysis-bot-release
npm install
3

Follow the documentation

Check the repository's README.md file for specific installation and usage instructions.

Repository Details

OwnerSRWS-PSG
Repometa-analysis-bot-release
Language
Python
LicenseMIT License
Last fetched8/8/2025

Recommended MCP Servers

💬

Discord MCP

Enable AI assistants to seamlessly interact with Discord servers, channels, and messages.

integrationsdiscordchat
🔗

Knit MCP

Connect AI agents to 200+ SaaS applications and automate workflows.

integrationsautomationsaas
🕷️

Apify MCP Server

Deploy and interact with Apify actors for web scraping and data extraction.

apifycrawlerdata
🌐

BrowserStack MCP

BrowserStack MCP Server for automated testing across multiple browsers.

testingqabrowsers

Zapier MCP

A Zapier server that provides automation capabilities for various apps.

zapierautomation