
Rigor Mcp
io.github.mrnh由 GitHub 帳號 mrnh 發布v0.5.0更新於 Oct 24, 2026
Verified statistical inference for AI agents: hypothesis tests, sequential testing, power.
概覽
讓助理執行經過驗證的統計檢定、效果量、檢定力計算與防偷看序貫分析,而不是憑記憶給出數字。
- 可以做什麼
- 提供 37 項操作,涵蓋經典假設檢定(t 檢定、z 檢定、卡方、Fisher 精確檢定、McNemar、變異數分析、Levene)、無母數替代方法(Mann-Whitney、Wilcoxon、Kruskal-Wallis)、相關、簡單迴歸、效果量、檢定力與樣本數計算,以及多重比較校正。結果以結構化 TestResult 回傳,包含檢定統計量、自由度、p 值、信賴區間、引用與假設警告。輔助工具可推薦適用的檢定,並在一次呼叫中完成所有兩兩比較及校正;序貫工具為反覆查看的結果提供始終有效的 p 值。
- 適用情境
- 適合需要計算而非回憶統計量的情境:設計實驗或估算樣本數、依資料形態選擇合適檢定、校正大量比較,或監控需要反覆查看結果的線上 A/B 測試。也可用來核對記憶中的教科書數字是否適用於略有不同的問題。
- 執行需求
- 以 Python 套件(PyPI rigor-mcp)形式透過 stdio 在本機執行,通常以 uvx 啟動或經 pip 安裝;需要 Python 與官方 mcp SDK。未宣告帳號、API 金鑰、環境變數或標頭。僅限桌面端,不是可於網頁執行的端點。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Rigor Mcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
rigor
Verified statistical inference for AI agents.
LLMs are decent at reciting statistics but bad at doing it reliably —
a t-statistic or a required sample size is a number recalled from
training data, not computed and checked. rigor is the alternative:
classical hypothesis testing (parametric and non-parametric),
correlation and regression, effect sizes, power/sample-size
calculation, multiple-comparisons correction, and always-valid
sequential testing for results checked more than once before they're
final, computed from scratch and returned as a cited, assumption-
checked answer -- plus a decision helper for picking the right tool and
a batch tool for running/correcting many comparisons at once, since
"which test do I even use," "I forgot to correct for multiple
comparisons," and "I peeked at the dashboard and stopped early" are
their own common failure modes, distinct from getting a single formula
wrong.
A concrete case where this matters. The one sample-size number everyone half-remembers is Cohen (1988)'s own worked example: d=0.5, alpha=.05, power=.80 -> n≈64 per group. It's in every textbook and slide deck, so it's also what gets pattern-matched to when a similar-looking question comes up. Ask instead for d=0.46, power=.85 -- a modest, realistic revision, not a trick:
85, not "about 64" -- a third more participants to recruit than the
half-remembered number suggests, from a question that looks like the
famous one. The formula itself isn't hard (power.py runs the same
bisection search either direction, in a few lines); the failure mode
is that recalling a nearby-looking answer feels indistinguishable from
computing the right one, right up until the number's wrong.
A second concrete case. An agent (or person) watching a live experiment's dashboard and checking the p-value every time new data comes in, stopping the moment it clears 0.05, is a textbook way to fool yourself -- and it's the default way anyone actually monitors a running experiment, fixed-sample design or not:
Checking 10 times at a nominal 5% level is really running at closer to
19% -- roughly one in five "significant" results would be noise even
with zero real effect. rigor sequential proportion / rigor sequential mean
compute an always-valid p-value instead (mSPRT, Johari et al. 2017):
checkable after every new observation with the false-positive rate
actually staying at the nominal level, no pre-committed sample size and
no correction for "how many times have I looked" required.
Built as an MCP server: a scan of the current MCP ecosystem (Context7 for coding docs, several physics/engineering/chemistry/geo servers, even Bentley's STAAD integration) found statistics/experimental design as one of the few common agent needs nobody had covered yet.
The statistics themselves (rigor/distributions.py, inference.py,
nonparametric.py, correlation.py, regression.py,
effect_size.py, power.py, corrections.py, plus the decision/batch
helpers in advisor.py and batch.py) are pure standard library, no
dependencies. The package as a whole does depend on the official mcp
SDK, since the MCP server is a first-class part of what it ships, not
an add-on -- see Install.
Install
(the PyPI distribution is rigor-mcp since plain rigor was already
taken by an unrelated package; the importable package and the CLI
command are both still just rigor.) This gets you both console
commands, rigor (CLI) and rigor-mcp (MCP server) -- deliberately
one install, no extras to get right, since uvx rigor-mcp (how most
MCP clients would actually invoke this) has no way to request an
extra.
What's in it
rigor/distributions.py— t, chi-squared, and F distributions built from scratch on stdlib (regularized incomplete gamma/beta), verified against exact closed-form identities (t(1) = Cauchy, chi2(2) = scaled exponential, t² = F(1, df)) rather than trusted transcription.rigor/inference.py— one-/two-sample and paired t-tests, one-/two-proportion z-tests, chi-squared goodness-of-fit and independence, Fisher's exact test (2x2, exact via the hypergeometric distribution — the small-sample alternative chi_square_independence's own low-expected-count warning points to), McNemar's test and McNemar's exact test (2x2, for paired proportions -- e.g. the same subjects' before/after answers -- which two_proportion_z_test's independent-groups assumption gets wrong; the exact version is via the binomial distribution on the discordant pairs, the same small-sample relationship Fisher's exact test has to chi_square_independence), one-way ANOVA, and Levene's (Brown-Forsythe) test for equal variances. Each returns aTestResult: statistic, degrees of freedom, two-tailed p-value, a confidence interval, a citation, and assumption warnings (e.g. small-n normality reliance, low expected cell counts).rigor/nonparametric.py— Mann-Whitney U, Wilcoxon signed-rank, and Kruskal-Wallis: the non-parametric alternative to two_sample_t_test/paired_t_test/one_way_anova respectively, for when a parametric test's own assumption warnings make its result suspect. Rank-based, with tie correction; also returnsTestResult.rigor/correlation.py— Pearson (linear) and Spearman (monotonic, via ranks) correlation, each returned as aTestResult(H0: no association) with a confidence interval via the Fisher z-transform.rigor/regression.py— simple (single-predictor) ordinary least squares regression: slope, intercept, R², and a significance test + CI for the slope.rigor/effect_size.py— Cohen's d, Hedges' g, Cohen's h, Cramér's V, eta²/omega² (for one_way_anova), and rank-biserial correlation (for mann_whitney_u).rigor/power.py— power and required sample size for the one-/two-sample t-test and two-proportion z-test (the one-sample formula covers paired_t_test too, since a paired t-test is a one-sample t-test on the differences). The two directions (given n, find power; given power, find n) are exact numerical inverses of each other by construction (bisection on the same underlying power function), and sanity-checked against the Cohen (1988) d=0.5/α=.05/power=.80 textbook reference case (n≈64).rigor/corrections.py— Bonferroni and Benjamini-Hochberg (FDR) multiple-comparisons correction.rigor/advisor.py—recommend_test: a decision helper, not a statistic. Answer a few characteristics of the data/question (continuous/proportion/categorical/ordinal, how many groups, paired, small-or-skewed, association-not-difference, checked-repeatedly) and get back which tool to call, what to call instead if this test's assumptions look shaky, and what to run alongside it -- compiling the cross-references every other module's docstrings already carry into one callable answer, so an agent doesn't need to have already read all of them to find the relevant one.checked_repeatedly=Trueroutes to asequential_*tool where one exists (two independent groups, continuous or proportion), and otherwise says so explicitly rather than silently ignoring the flag.rigor/batch.py—pairwise_group_comparisons: runs every pairwise comparison across 2+ groups (two_sample_t_testormann_whitney_u, your choice) and applies Bonferroni/BH correction to the whole batch in one call, instead of the agent orchestrating k*(k-1)/2 separate calls plus a correction call by hand and risking forgetting the correction step. The natural follow-upone_way_anova/kruskal_wallisalready recommend in their own docstrings once a result comes back significant.rigor/sequential.py— always-valid (peeking-safe) sequential testing via the mixture sequential probability ratio test (mSPRT): every other test in this package assumes a fixed sample size decided in advance and checked once; this one is designed to be re-checked after every new observation (e.g. a live A/B test dashboard) without inflating the false-positive rate the way naively re-running a fixed-sample test at each check does. Closed-form (Robbins 1970; Johari, Koomen, Pekelis & Walsh 2017), covering two-sample means and two proportions, plusnaive_peeking_inflation-- a seeded Monte Carlo demonstration of exactly the failure mode this exists to avoid. The always-valid guarantee itself (not just a single p-value's correctness) is checked by simulation intests/test_sequential.py. One deliberately counterintuitive choice: complete separation at a small n (e.g. 0/5 vs. 5/5) reports no actionable evidence (p=1), not the maximal evidence a one-shot Fisher's exact test would call it -- because this test gets checked after every single observation, and small-n complete separation happens under the null purely by chance often enough (~40% at n=1 per arm) that treating it as proof would defeat the always-valid guarantee itself. Caught by the guarantee simulation during development, not by inspection.rigor/cli.py— a CLI over all of the above (rigor.pyat the repo root is a thin shim sopython3 rigor.py ...also works from a plain checkout, without installing anything).rigor/mcp_server.py— an MCP tool wrapper exposing all 37 operations to any MCP client (Claude Code, Claude Desktop, etc.). Smoke-tested end-to-end over stdio against a real client — tool discovery plus representative calls checked against known reference values, including the full round-trip still landing the Cohen (1988) case at n=63 and Fisher's original "lady tasting tea" case at p≈0.4857.
Usage
CLI, once installed:
or straight from a checkout without installing anything:
MCP server, over stdio (the transport local clients like Claude Code expect):
or from a checkout: pip install mcp && python3 -m rigor.mcp_server.
Register it with Claude Code:
(or, from a checkout: claude mcp add rigor -- python3 -m rigor.mcp_server,
run from this repo's root or with an absolute module path). For
interactive poking with the MCP Inspector, run it as a script rather
than the installed command — which means the package root has to be
put on the path by hand, since the Inspector imports the file directly:
A transport-level edge case, handled
cohens_d correctly returns +inf/-inf for zero-variance samples
(per its own documented contract), but non-finite floats serialize to
JSON null over MCP's structured content — which used to fail the
tool's own number-typed output schema and crash the call. The MCP
cohens_d tool now returns {"value": float | null, "warnings": [...]}
instead of a bare float, so that case is reported explicitly (null
value, a warning naming the direction) rather than blowing up. That
fix is specific to tools with a bare-scalar output schema — every
tool that returns a dict (all the TestResult-based ones, plus
simple_linear_regression) has been confirmed over real stdio to pass
a non-finite field straight through as JSON's non-standard Infinity,
since a generic dict return doesn't get a strict per-field number
schema. Of the bare-float tools, cohens_d is the only one that can
actually produce a non-finite value.
Tests
203 tests: 182 exercise the statistics/decision logic directly
(including, for sequential.py, a simulation check that the
always-valid guarantee itself holds under repeated peeking, not just
that a single p-value comes out right -- and, during development, a
simulation catching a real bug: an early draft treated small-n complete
separation as maximal evidence rather than the small-sample noise it
usually is, which broke that same guarantee); 18 spawn mcp_server.py
as a real MCP client would and check results over the wire (skipped
automatically if mcp isn't installed); 3 check that server.json's
metadata (version, description length, name length) hasn't drifted
from pyproject.toml's or the MCP Registry's own limits (the two files
aren't otherwise linked -- see test_release_metadata.py).
License
MIT — see LICENSE.
來源:README.md,提交 762c3db
工具
0版本歷史
2- v0.5.0最新Sep 17, 2026
- v0.3.0Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分