rigor-mcp について
rigor-mcpは、AIエージェント向けの統計推論MCPサーバー兼コマンドラインツールです。古典的・逐次検定、検出力、効果量、多重比較補正を計算し、引用と仮定に関する警告も返します。
主な機能
- 01パラメトリック・ノンパラメトリック検定
- 02相関分析と回帰
- 03検出力とサンプルサイズの計算
- 04多重比較補正
- 05常に有効な逐次検定
- 06検定の推奨と一括比較
活用シーン
- 01実験データの仮説検定
- 02研究に必要なサンプルサイズの推定
- 03データを繰り返し確認する実験の監視
- 04多群のペア比較と補正
MCP 対応
互換クライアント向けに、検定選択、一括比較、逐次検定など37種類の統計ツールを公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
37掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| mu0 | number | はい | 標本との比較に用いる仮説母平均 |
| data | array | はい | 標本。各観測値を 1 つの数値で指定します |
| alpha | number | いいえ | 検定(および信頼区間)の有意水準。デフォルトは 0.05 |
詳細
rigor
AI エージェント向けの、検証済み統計的推論です。
LLM は統計をそれらしく説明するのは得意ですが、確実に実行するのは苦手です。t 統計量や必要サンプルサイズは、計算して確認した値ではなく、学習データから思い出した数値です。rigor はその代替手段です。古典的な仮説検定(パラメトリックおよびノンパラメトリック)、相関と回帰、効果量、検出力/サンプルサイズの計算、多重比較補正、最終結果が出る前に複数回確認する場合に使える常に有効な逐次検定を、一から計算し、出典を示して前提条件を確認した回答として返します。さらに、適切なツールを選ぶための判断支援ツールと、多数の比較を一度に実行・補正するバッチツールも備えています。「どの検定を使えばいいのか分からない」「多重比較の補正を忘れた」「ダッシュボードを見て早めに打ち切った」は、単一の数式を間違えるのとは別の、よくある失敗だからです。
具体例:これが重要となるケース。 誰もがうろ覚えにしているサンプルサイズの数値は、Cohen(1988)の実例そのものです。d=0.5、alpha=.05、power=.80 の場合、群ごとに n≈64 です。あらゆる教科書やスライドに載っているため、似た質問が出ると、この数値がパターンマッチで引き出されます。代わりに、d=0.46、power=.85 と尋ねてみましょう。意地悪な問題ではなく、現実的で小幅な変更です。
$ rigor power ttest-2samp --effect-size 0.46 --power 0.85
Required n per group = 84.86 (round up: 85)
85 です。「約 64」ではありません。これは、有名な例に似ている質問から導かれる数値であり、うろ覚えの数値から推測されるよりも、3 分の 1 多くの参加者を募集する必要があります。数式自体は難しくありません(power.py は同じ二分探索をどちらの方向にも数行で実行します)。失敗の原因は、近い質問への答えを思い出すことと、正しい答えを計算することが、数値が間違っていると分かる直前まで区別できないことです。
2 つ目の具体例。 実験の進行中に、エージェント(または人)がダッシュボードを見て、新しいデータが入るたびに p 値を確認し、0.05 を下回った瞬間に打ち切るのは、自分自身を誤解させる典型的な方法です。固定サンプル設計かどうかにかかわらず、実際に実験を監視する際によく行われる方法でもあります。
$ rigor sequential peeking-inflation --n-looks 10
Naive repeated peeking, 10 looks, nominal alpha=0.05
estimated true alpha = 0.1918 (+/- 0.0028 MC SE, 20000 trials)
公称 5% の水準で 10 回確認すると、実際の有意水準は約 19% になります。真の効果がまったくなくても、「有意」となる結果の約 5 件に 1 件はノイズです。rigor sequential proportion/rigor sequential mean は、代わりに常に有効な p 値を計算します(mSPRT、Johari ほか、2017 年)。新しい観測値が追加されるたびに確認でき、偽陽性率は実際に公称水準に保たれます。事前にサンプルサイズを決める必要も、「何回確認したか」に対する補正も不要です。
MCP サーバーとして構築されています。現在の MCP エコシステムを調査したところ(コーディングドキュメント向けの Context7、物理学/工学/化学/地理学の複数のサーバー、さらには Bentley の STAAD 統合も含みます)、統計/実験計画は、一般的なエージェントのニーズのうち、まだ誰も対応していない数少ない分野の 1 つでした。
統計処理そのもの(rigor/distributions.py、inference.py、nonparametric.py、correlation.py、regression.py、effect_size.py、power.py、corrections.py、および advisor.py と batch.py の判断支援/バッチ用ヘルパー)は、依存関係のない純粋な標準ライブラリで実装されています。MCP サーバーは追加機能ではなく、このパッケージが提供する主要機能の 1 つであるため、パッケージ全体では公式の mcp SDK に依存します。詳しくは インストール を参照してください。
インストール
pip install rigor-mcp
(PyPI のディストリビューション名は rigor-mcp です。単に rigor という名前は、すでに無関係な別のパッケージに使われていたためです。インポート可能なパッケージ名と CLI コマンド名は、どちらも引き続き rigor です。)これにより、コンソールコマンド rigor(CLI)と rigor-mcp(MCP サーバー)の両方を利用できます。わざわざ 1 回のインストールで済むようにしており、追加設定も不要です。ほとんどの MCP クライアントが実際にこのパッケージを呼び出す方法である uvx rigor-mcp では、追加機能を指定できないためです。
含まれる機能
rigor/distributions.py— 標準ライブラリ上にゼロから実装した t 分布、カイ二乗分布、F 分布 (正則化不完全ガンマ関数/ベータ関数を使用)です。 信頼できる転記に頼るのではなく、厳密な閉形式の恒等式(t(1) = Cauchy、 chi2(2) = scaled exponential、t² = F(1, df))と照合して検証しています。rigor/inference.py— 1 標本/2 標本 t 検定と対応のある t 検定、 1 比率/2 比率 z 検定、カイ二乗適合度検定と独立性検定、 Fisher の正確検定(2x2、超幾何分布による正確検定です。少標本の場合の代替手法であり、chi_square_independence自身の期待度数が低い場合の警告が推奨先として示します)、 McNemar 検定と McNemar の正確検定(2x2、対応のある 比率用です。たとえば 同じ被験者の前後の回答を比較する場合です。two_proportion_z_testの 独立群という仮定では誤った結果になります。正確版では、不一致ペアに対する二項分布を使用します。 これは、Fisher の正確検定とchi_square_independenceの間にあるものと同じ 少標本での関係です)、一元配置 ANOVA、および等分散性を検定する Levene(Brown-Forsythe)検定を提供します。各検定はTestResultを返します。 内容は、検定統計量、自由度、両側 p 値、信頼区間、引用文献、仮定に関する警告 (例:標本数が少ない場合の正規性への依存、期待セル度数の低さ)です。rigor/nonparametric.py— Mann-Whitney U 検定、Wilcoxon 符号付順位検定、 Kruskal-Wallis 検定を提供します。これらはそれぞれtwo_sample_t_test/paired_t_test/one_way_anovaのノンパラメトリックな代替手法であり、 パラメトリック検定自体の仮定に関する警告から、その結果が疑わしい場合に使用します。 同順位の補正を含む順位ベースの検定で、こちらもTestResultを返します。rigor/correlation.py— Pearson(線形)相関と Spearman (順位を使用する単調)相関を提供します。各検定は、Fisher の z 変換による 信頼区間を含むTestResult(帰無仮説:関連なし)として返されます。rigor/regression.py— 単回帰(予測変数 1 つ)の通常最小二乗回帰です。 傾き、切片、R²、傾きの有意性検定と信頼区間を提供します。rigor/effect_size.py— Cohen の d、Hedges の g、Cohen の h、Cramér の V、eta²/omega²(one_way_anova用)、および順位二系列相関 (mann_whitney_u用)を提供します。rigor/power.py— 1 標本/2 標本 t 検定と 2 比率 z 検定の検出力および 必要標本数を計算します(対応のある t 検定は、差分に対する 1 標本 t 検定であるため、 1 標本の式でpaired_t_testにも対応します)。2 つの計算方向(n が与えられた場合に 検出力を求める、検出力が与えられた場合に n を求める)は、同じ基礎検出力関数に対する 二分法によって構成上、互いに厳密な数値的逆関数となっています。また、教科書で使われる Cohen (1988) の d=0.5/α=.05/power=.80 の基準例(n≈64)と照合しています。rigor/corrections.py— 多重比較に対する Bonferroni 補正と Benjamini-Hochberg(FDR)補正を提供します。rigor/advisor.py—recommend_testは統計量ではなく、検定の選択を支援する関数です。 データや質問のいくつかの特徴(連続値/比率/カテゴリ/順序尺度、グループ数、対応の有無、 標本数が少ないか偏りがあるか、差ではなく関連を調べるか、繰り返し確認したか)に回答すると、 呼び出すツール、この検定の仮定が不確かな場合に代わりに呼び出すもの、併せて実行すべきものが 返されます。他の各モジュールの docstring にすでに記載されている相互参照を、1 回の呼び出しで 利用できる回答にまとめているため、エージェントは関連する項目を見つけるために、 あらかじめすべての docstring を読んでおく必要がありません。checked_repeatedly=Trueの場合、 利用可能なものについてはsequential_*ツールに振り分けます(独立した 2 グループ、 連続値または比率)。利用できない場合は、フラグを黙って無視するのではなく、その旨を明示します。rigor/batch.py—pairwise_group_comparisonsは、2 つ以上のグループについて ペアごとの比較(two_sample_t_testまたはmann_whitney_uを選択)をすべて実行し、 Bonferroni/BH 補正をまとめて適用します。これにより、エージェントが k*(k-1)/2 回の個別呼び出しと 補正の呼び出しを手動で順番に実行し、補正を忘れるリスクを避けられます。有意な結果が返された場合に 次に実行するのが自然なone_way_anova/kruskal_wallisは、それぞれの docstring ですでに推奨されています。rigor/sequential.py— 混合逐次確率比検定(mSPRT)による、常に有効な(途中確認に安全な) 逐次検定を提供します。このパッケージの他の検定は、事前に固定した標本数を一度だけ確認することを 前提としています。一方、この検定は、新しい観測値が得られるたびに再確認する(例:稼働中の A/B テストのダッシュボード)よう設計されており、固定標本数の検定を確認のたびに単純に再実行した場合のように、 偽陽性率が上昇しません。閉形式の検定(Robbins 1970; Johari, Koomen, Pekelis & Walsh 2017)で、2 標本の平均値と 2 比率を対象としています。また、これが防ぐべき失敗例をそのまま再現する、シード指定可能な モンテカルロ実演naive_peeking_inflationも提供します。常に有効であるという保証自体 (単一の p 値の正しさだけでなく)は、tests/test_sequential.pyでシミュレーションにより 検証しています。意図的に直感に反する設計上の選択が 1 つあります。小さな n で完全分離が 起きた場合(例:0/5 対 5/5)には、Fisher の正確検定を一度だけ実行すれば最大の証拠と判断される 結果ではなく、判断に使える証拠なし(p=1)と報告します。この検定は観測のたびに確認されるため、 小さな n での完全分離は帰無仮説のもとでも偶然に十分な頻度(各群 n=1 で約 40%)で発生し、 それを証明として扱うと、常に有効であるという保証自体が損なわれるためです。この問題は、 開発中に保証のシミュレーションで検出されたものであり、コードの確認だけでは見つかりませんでした。rigor/cli.py— 上記すべてを利用できる CLI です(リポジトリのルートにあるrigor.pyは薄いラッパーで、インストールしていない通常のチェックアウトからもpython3 rigor.py ...を実行できます)。rigor/mcp_server.py— 37 個すべての操作を、あらゆる MCP クライアント (Claude Code、Claude Desktop など)に公開する MCP ツールラッパーです。 実際のクライアントに対し、stdio 経由でエンドツーエンドのスモークテストを実施しています。 ツールの検出に加え、既知の参照値と照合した代表的な呼び出しも確認しており、 一連の往復処理で Cohen (1988) の基準例が n=63 となり、Fisher の元の 「紅茶の試飲」事例が p≈0.4857 となることも検証済みです。
使用方法
インストール後の CLI:
rigor ttest one-sample --data 5.1,4.9,5.3,5.0,4.8,5.2 --mu0 5.0
rigor corr pearson --x 1,2,3,4,5 --y 2,4,5,4,5
rigor regress --x 1,2,3,4,5 --y 3,5,7,9,11
rigor nonparam mann-whitney --a 1,2,3 --b 4,5,6
rigor power ttest-2samp --effect-size 0.5 --power 0.8
rigor recommend --outcome-type continuous --n-groups 3 # which test fits?
rigor posthoc --groups "1,2,3|4,5,6|7,8,9" --labels A,B,C # pairwise + correction
rigor mcnemar --table "794,86;150,570" # paired proportions, e.g. before/after
rigor sequential proportion --successes1 55 --n1 500 --successes2 40 --n2 500 --tau 0.05
# ^ peeking-safe -- rerun as n1/n2 grow, no correction needed
rigor sequential peeking-inflation --n-looks 10 # ...vs. naively checking 10 times
rigor --help # full list of subcommands (ttest, ztest, chi2, fisher, mcnemar,
# mcnemar-exact, anova, levene, nonparam, corr, regress,
# effect-size, power, correct, recommend, posthoc, sequential)
または、何もインストールせずにチェックアウトから直接実行:
python3 rigor.py ttest one-sample --data 5.1,4.9,5.3,5.0,4.8,5.2 --mu0 5.0
stdio 経由の MCP サーバー(Claude Code などのローカルクライアントが想定するトランスポート):
pip install rigor-mcp
rigor-mcp
チェックアウトから実行する場合:pip install mcp && python3 -m rigor.mcp_server。
Claude Code に登録します:
claude mcp add rigor -- rigor-mcp
(または、チェックアウトから実行する場合:claude mcp add rigor -- python3 -m rigor.mcp_server。このリポジトリのルートから実行するか、絶対モジュールパスを指定します)。MCP Inspector で対話的に試す場合は、インストール済みのコマンドではなくスクリプトとして実行してください。Inspector はファイルを直接インポートするため、パッケージのルートを手動でパスに追加する必要があります:
pip install "mcp[cli]"
PYTHONPATH=. mcp dev rigor/mcp_server.py
対応済みのトランスポート層のエッジケース
cohens_d は、分散がゼロのサンプルに対して、(自身のドキュメントに記載された仕様どおり)正しく +inf/-inf を返しますが、非有限の浮動小数点数は MCP の構造化コンテンツ経由で JSON の null にシリアライズされるため、以前はツール自体の数値型出力スキーマに適合せず、呼び出しがクラッシュしていました。MCP の cohens_d ツールは、単一の浮動小数点数の代わりに {"value": float | null, "warnings": [...]} を返すようになりました。そのため、このケースではクラッシュするのではなく、方向を示す警告とともに null 値が明示的に報告されます。この修正は、単一スカラー値の出力スキーマを持つツールに固有のものです。辞書を返すすべてのツール(TestResult ベースのものと simple_linear_regression)は、実際の stdio 経由で、非有限のフィールドを JSON の非標準値 Infinity のまま渡せることが確認されています。汎用的な辞書の戻り値には、フィールドごとの厳格な数値スキーマが適用されないためです。単一の浮動小数点数を返すツールのうち、実際に非有限の値を生成する可能性があるのは cohens_d だけです。
テスト
python3 -m unittest discover -s tests -v
203 件のテストがあります。182 件は統計/意思決定ロジックを直接検証します(sequential.py については、単一の p 値が正しく得られるかだけでなく、繰り返し覗き見しても常に有効であるという保証自体が成り立つかをシミュレーションで確認します。また開発中には、小さな n で完全分離が起きた場合に、それを通常の小標本ノイズではなく最大の証拠として扱ってしまう初期案のバグもシミュレーションで検出しました。このバグは同じ保証を損なっていました)。18 件は、実際の MCP クライアントと同様に mcp_server.py を起動し、通信経由で結果を確認します(mcp がインストールされていない場合は自動的にスキップされます)。3 件は、server.json のメタデータ(バージョン、説明の長さ、名前の長さ)が、pyproject.toml および MCP Registry 独自の制限から逸脱していないことを確認します(この 2 つのファイルはそれ以外では連携していません。test_release_metadata.py を参照してください)。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。