# rigor-mcp [Health: Active]

**Category:** 🧮 Data Science Tools  
**Repository:** https://github.com/mrnh/rigor  
**GitHub Stars:** 1  
**Views:** 1  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/rigor-mcp

## Description
Verified statistical inference for AI agents: t-tests, effect sizes, power, and corrections.

## Tools
Capabilities this server exposes over MCP:

- **one_sample_t_test** — Test whether a sample's mean differs from a hypothesized value mu0.
    Returns the t-statistic, degrees of freedom, two-tailed p-value, a
    confidence interval for the mean, and any assumption warnings.
- **two_sample_t_test** — Test whether two independent samples have different means. Defaults
    to Welch's t-test (does not assume equal variances); pass
    equal_var=true for the classic pooled-variance test.
- **paired_t_test** — Test whether the mean difference between paired observations (e.g.
    before/after measurements on the same subjects, or matched pairs) is
    zero. a[i] and b[i] must be the two measurements of the same pair --
    use two_sample_t_test instead if the two samples are independent
    (different subjects in each group). Returns the t-statistic, degrees
    of freedom (n-1), two-tailed p-value, a confidence interval for the
    mean difference, a citation, and assumption warnings.
- **one_proportion_z_test** — Test whether an observed proportion (successes out of n) differs
    from a hypothesized proportion p0 -- e.g. "is this coin fair (p0=0.5)
    given 55 heads in 100 flips?" Uses the normal approximation, which
    degrades for small n or p0 near 0 or 1; a warning is included when
    that assumption looks shaky. Returns the z-statistic, two-tailed
    p-value, a confidence interval for the true proportion, a citation,
    and warnings.
- **two_proportion_z_test** — Test whether two independent proportions differ -- the standard test
    behind comparing conversion rates between two groups (e.g. an A/B
    test). Returns the z-statistic, two-tailed p-value, a confidence
    interval for the difference in proportions, a citation, and
    warnings.
- **chi_square_goodness_of_fit** — Test whether observed category counts match an expected
    distribution -- e.g. "are these six days-of-week signup counts
    evenly distributed, or skewed towards weekends?" Returns the
    chi-squared statistic, degrees of freedom (len-1), p-value, a
    citation, and a warning if any expected count is below 5 (the usual
    threshold below which this approximation gets unreliable).
- **chi_square_independence** — Test whether the row and column variables of a contingency table
    are independent (e.g. "does group membership relate to outcome?").
    Returns the chi-squared statistic, degrees of freedom, p-value, a
    citation, and a warning if any expected cell count is below 5
    (consider cramers_v afterwards for effect size).
- **one_way_anova** — Test whether three or more independent groups have different
    means -- e.g. comparing average order value across three marketing
    channels. A significant result means at least one group differs from
    the others, not which one -- follow up with pairwise
    two_sample_t_test calls (correcting for multiple comparisons via
    bonferroni_correction or benjamini_hochberg_correction) to find
    which. Returns the F-statistic, between/within degrees of freedom,
    p-value, a citation, and a warning if within-group df is small.
- **levene_test** — Test whether two or more groups have equal population variances
    (homogeneity of variance) -- use this to decide equal_var for
    two_sample_t_test, or to sanity-check one_way_anova's
    equal-variance assumption. Uses the Brown-Forsythe variant
    (deviations from each group's median), more robust to non-normal
    data than the original mean-based Levene's test. Returns the same
    shape as one_way_anova (it's computed as one internally, on
    absolute deviations from each group's median).
- **fisher_exact_test** — Test whether the row and column variables of a 2x2 contingency
    table are independent -- exact (via the hypergeometric distribution
    over all tables with the same margins), unlike
    chi_square_independence's chi-squared approximation. Use this
    instead whenever chi_square_independence warns an expected cell
    count is below 5, or whenever the sample is small. 2x2 tables only.
    Returns the sample odds ratio as ``statistic`` (can be inf/0 for a
    zero cell), a two-tailed p-value, a citation, and warnings.
- **mcnemar_test** — Test whether two paired proportions are equal -- e.g. the same
    subjects' yes/no answers before and after an intervention, or two
    raters' calls on the same items. Use this instead of
    two_proportion_z_test whenever the "two groups" are actually the
    same subjects measured twice; two_proportion_z_test assumes
    independent groups and gets the standard error wrong for paired
    data. Yates continuity-corrected chi-squared, 1 df -- use
    mcnemar_exact_test instead when there are few discordant pairs
    (this warns when there are). Returns that chi-squared statistic, a
    p-value, and a confidence interval for the difference in marginal
    proportions.
- **mcnemar_exact_test** — Exact version of mcnemar_test: an exact binomial test (p=0.5) on
    the discordant pairs instead of the chi-squared approximation -- the
    small-sample-safe alternative mcnemar_test's own warning points to,
    the same relationship fisher_exact_test has to
    chi_square_independence. ``statistic`` is b-c (the raw
    discordant-pair imbalance); the p-value is two-tailed.
- **cohens_d** — Standardized mean difference between two samples (pooled SD).
    Use alongside two_sample_t_test, which tells you whether a
    difference is significant but not how large it is. Rough guidance:
    ~0.2 small, ~0.5 medium, ~0.8 large -- context-dependent. Returns
    {"value": float or null, "warnings": [...]}. value is null only
    when both samples have zero variance and unequal means, where the
    effect size is mathematically infinite -- see the warning for which
    direction, and report the raw mean difference instead in that case.
- **cohens_h** — Effect size for a difference between two proportions (Cohen,
    1988), via the arcsine-square-root transform -- more appropriate
    than a raw percentage-point difference since it stabilizes variance
    across the full [0, 1] range. p1 and p2 are interchangeable (the
    sign of the result just indicates direction); use alongside
    two_proportion_z_test, which tells you whether a difference is
    significant but not how large it is. Returns a float (can be
    negative); rough guidance: ~0.2 small, ~0.5 medium, ~0.8 large.
- **cramers_v** — Effect size for a chi-squared test of independence (Cramer, 1946),
    normalized to [0, 1] regardless of table shape so it's comparable
    across tables of different sizes, unlike the raw chi-squared
    statistic. Call after chi_square_independence, passing its
    statistic and the same table's n/rows/cols. Returns a float in
    [0, 1]; rough guidance for a 2x2 table: ~0.1 small, ~0.3 medium,
    ~0.5 large -- the threshold shifts for larger tables.
- **eta_squared** — Effect size for a one-way ANOVA: proportion of total variance
    explained by group membership. Use alongside one_way_anova, which
    tells you whether groups differ but not how much of the variance
    that accounts for. Rough guidance: ~0.01 small, ~0.06 medium, ~0.14
    large. Biased upward for small samples -- prefer omega_squared when
    that matters. Returns a float in [0, 1].
- **omega_squared** — Effect size for a one-way ANOVA, less biased than eta_squared for
    small samples since it subtracts out the variance explained by
    chance alone. Use alongside one_way_anova. Can be slightly negative
    when the true effect is near zero -- that's expected, not an error.
- **rank_biserial_correlation** — Effect size for a Mann-Whitney U test. Call after mann_whitney_u,
    passing its statistic and the two sample sizes. Positive means
    sample 1's values tend to exceed sample 2's; negative means the
    reverse; 0 is no tendency either way. Returns a float in [-1, 1];
    rough guidance mirrors Cohen's d: ~0.1 small, ~0.3 medium, ~0.5
    large.
- **pearson_correlation** — Test for a *linear* association between two paired variables --
    e.g. "does hours studied predict test score?" statistic is r itself
    (in [-1, 1]), not a t-statistic. Returns r, df (n-2), a two-tailed
    p-value (H0: r=0), a confidence interval for r via the Fisher
    z-transform, a citation, and warnings. Use spearman_correlation
    instead if the relationship may be monotonic but not linear, or if
    outliers shouldn't dominate the result. Use simple_linear_regression
    instead for the actual slope (units of y per unit of x), not just
    the strength of association.
- **spearman_correlation** — Test for a *monotonic* association between two paired variables,
    via the Pearson correlation of their ranks -- doesn't assume
    linearity and is far less sensitive to outliers' exact magnitude
    than pearson_correlation. Same return shape as pearson_correlation
    (statistic is rho itself, in [-1, 1]).
- **simple_linear_regression** — Fit y = intercept + slope * x by ordinary least squares -- single
    predictor only. Reports the slope (change in y per unit of x), the
    intercept, R^2 (proportion of y's variance explained by x), and a
    significance test + confidence interval for the slope (H0:
    slope=0). Use pearson_correlation instead if you only need the
    strength of a linear association, not its actual units/magnitude.
- **mann_whitney_u** — The non-parametric alternative to two_sample_t_test -- use when
    that test's own small-n warning makes a normal-theory result
    suspect, or the data is ordinal/skewed. Tests whether values from
    sample a are systematically larger or smaller than values from
    sample b, by ranking the combined data rather than assuming normal
    populations. statistic is U for sample a; pair with
    rank_biserial_correlation for a standardized effect size. Returns
    the same result shape as the parametric tests (statistic, p_value,
    citation, warnings).
- **wilcoxon_signed_rank** — The non-parametric alternative to paired_t_test -- use when that
    test's own small-n warning makes a normal-theory result suspect.
    Tests whether the median of the paired differences is zero, by
    ranking the absolute differences rather than assuming they're
    normally distributed. Pairs with a zero difference are dropped (and
    counted in a warning), the standard procedure. statistic is T =
    min(W+, W-).
- **kruskal_wallis** — The non-parametric alternative to one_way_anova -- use when that
    test's own small-df warning makes a normal-theory result suspect.
    Tests whether all groups are drawn from the same distribution, by
    ranking the combined data rather than assuming normal populations.
    A significant result means at least one group differs, not which
    one -- same caveat as one_way_anova.
- **sample_size_for_two_sample_t_test** — How many observations per group are needed to detect a given
    Cohen's d with a two-sample t-test at the target power. Returns a
    continuous value and a rounded-up integer to actually use.
- **power_for_two_sample_t_test** — Statistical power to detect a given Cohen's d with n_per_group
    observations per group, using a two-sample t-test. Power is the
    probability of correctly detecting a real effect of this size at
    the given alpha; a design with low power means a non-significant
    result would be inconclusive rather than good evidence the effect
    doesn't exist. Use sample_size_for_two_sample_t_test instead to
    solve for n given a target power. Returns a float in [alpha, 1].
- **sample_size_for_one_sample_t_test** — How many observations are needed to detect a given Cohen's d with
    a one-sample (or paired) t-test at the target power. Use for
    paired_t_test too -- a paired t-test is a one-sample t-test on the
    differences, so the same power formula applies. Returns a
    continuous value and a rounded-up integer to actually use.
- **power_for_one_sample_t_test** — Statistical power to detect a given Cohen's d with n observations,
    using a one-sample (or paired) t-test. Use for paired_t_test too --
    it's a one-sample t-test on the differences, so the same power
    formula applies. Use sample_size_for_one_sample_t_test instead to
    solve for n given a target power. Returns a float in [alpha, 1].
- **sample_size_for_two_proportion_test** — How many observations per group are needed to detect a difference
    between two proportions (e.g. conversion rates) at the target power.
    p1 and p2 are interchangeable -- only their difference matters.
- **power_for_two_proportion_test** — Statistical power to detect a difference between two proportions
    (e.g. two conversion rates) with n_per_group observations in each
    group, using a two-proportion z-test. p1 and p2 are interchangeable
    (only their difference matters) -- e.g. current vs. new conversion
    rate. Use sample_size_for_two_proportion_test instead to solve for n
    given a target power. Returns a float in [alpha, 1].
- **bonferroni_correction** — Adjust a batch of p-values for multiple comparisons, controlling
    the family-wise error rate. Conservative; use when any false positive
    among the batch is costly.
- **benjamini_hochberg_correction** — Adjust a batch of p-values for multiple comparisons, controlling
    the false discovery rate. Less conservative than Bonferroni; the
    standard choice when testing many hypotheses at once.
- **recommend_test** — Not sure which rigor tool fits your question? Answer a few
    characteristics of the data and get back which tool to call, why,
    what to call instead if this test's assumptions look shaky, and
    what to run alongside it (an effect size, a power calculation, a
    natural follow-up). Every test in this package already documents
    this guidance in its own docstring for the sibling comparisons it
    knows about -- this tool exists so you don't have to have already
    read every other tool's docstring to find the one relevant
    cross-reference. Pure decision logic, no statistics computed here.
- **sequential_two_sample_mean_test** — Always-valid test of whether two groups' means differ, safe to
    call again after every new observation in either group -- unlike
    two_sample_t_test, which needs a sample size decided in advance and
    gives no such guarantee if checked repeatedly and stopped at the
    first significant look (that repeated-checking failure mode is
    exactly what inflates false positives; see naive_peeking_inflation
    for a demonstration). Use this instead of two_sample_t_test whenever
    a result will be (or already has been) checked more than once as
    data accumulates, e.g. monitoring a live experiment. Returns the
    current effect estimate, its standard error, the mixture likelihood
    ratio and always-valid p-value, and assumption warnings. tau does
    not need to be exact -- reuse the minimum-detectable-effect you'd
    otherwise plug into sample_size_for_two_sample_t_test.
- **sequential_two_proportion_test** — Always-valid test of whether two proportions (e.g. two conversion
    rates in a live A/B test) differ, safe to call again after every new
    observation in either group -- the sequential-monitoring counterpart
    to two_proportion_z_test. Use this instead whenever the result will
    be checked more than once before the experiment ends, which is the
    normal case for a live dashboard rather than a one-shot analysis.
    p1 and p2 are interchangeable (only their difference matters). tau
    does not need to be exact -- reuse the minimum-detectable-effect
    you'd otherwise plug into sample_size_for_two_proportion_test.
- **naive_peeking_inflation** — Demonstrates, by simulation, why sequential_two_sample_mean_test /
    sequential_two_proportion_test exist: the actual false-positive rate
    of checking an *ordinary* fixed-sample test (two_sample_t_test,
    two_proportion_z_test, ...) after every new observation and stopping
    the first time it clears alpha, versus the alpha actually intended.
    Call this to show a skeptical stakeholder concretely what "just
    peek at the dashboard and stop early" costs before recommending the
    always-valid alternative. Returns the estimated true false-positive
    rate, its Monte Carlo standard error, and a citation.
- **pairwise_group_comparisons** — Run every pairwise comparison across 2+ groups and correct for
    multiple comparisons in one call, instead of orchestrating
    k*(k-1)/2 separate two_sample_t_test/mann_whitney_u calls plus a
    separate correction call by hand -- and forgetting the correction
    is one of the most common real mistakes this package exists to
    prevent. The natural follow-up after a significant
    one_way_anova/kruskal_wallis result: pass the same groups here to
    find *which* group(s) differ, not just whether any do. Returns
    every pair's statistic, raw p-value, whether it's still significant
    after correction, and an effect size, plus the correction method's
    citation and warnings.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `uvx` (confidence: high):

```json
"mcpServers": {
  "rigor-mcp": {
    "command": "uvx",
    "args": ["rigor-mcp"]
  }
}
```

## Documentation

## What rigor-mcp MCP server does

The rigor-mcp MCP server gives AI agents a collection of statistical inference tools that calculate results from scratch. It covers one- and two-sample, paired, and proportion tests; chi-squared, Fisher's exact, McNemar's, ANOVA, and variance tests; non-parametric alternatives; correlations; simple linear regression; effect sizes; power and sample-size calculations; and multiple-comparisons correction.

Most inference results are returned as structured test results containing a statistic, degrees of freedom when applicable, a two-tailed p-value, a confidence interval, a citation, and warnings about assumptions. The package also includes a test-selection helper and a batch comparison tool, so an agent can choose an analysis or run many group comparisons without manually coordinating every step.

## How it works

The rigor-mcp MCP server is implemented as a Python package with an MCP server entry point. Its statistical calculations use the Python standard library rather than third-party numerical dependencies. Distribution functions for t, chi-squared, and F statistics are implemented directly and checked against stated mathematical identities.

Power calculations support one- and two-sample t-tests and two-proportion z-tests. The implementation can calculate power from a sample size or solve for sample size from a target power using the same underlying function in both directions. Effect-size tools include Cohen's d, Hedges' g, Cohen's h, Cramér's V, eta-squared, omega-squared, and rank-biserial correlation.

Sequential tools address analyses checked repeatedly during data collection. The package provides always-valid mSPRT methods for two-sample means and two proportions, as well as a seeded simulation that estimates false-positive inflation from naive repeated peeking. These methods are intended for repeated checks rather than ordinary fixed-sample testing.

## Setup and configuration

Install the PyPI distribution with:

```sh
pip install rigor-mcp
```

The installation provides both the `rigor` command-line interface and the `rigor-mcp` MCP server command. The importable package and CLI name remain `rigor`, while the distribution name is `rigor-mcp`. MCP clients can invoke the server with `uvx rigor-mcp`.

No environment variables or external data-service credentials are documented as required. The package as a whole depends on the official MCP SDK; the statistical modules themselves use the standard library.

## Tools and capabilities

The rigor-mcp MCP server includes capabilities for:

- Selecting an appropriate test from data type, group count, pairing, distribution concerns, association questions, or repeated checking.
- Running pairwise comparisons across multiple groups and applying Bonferroni or Benjamini-Hochberg correction to the complete batch.
- Choosing parametric or rank-based methods, including Mann-Whitney U, Wilcoxon signed-rank, and Kruskal-Wallis tests.
- Computing Pearson or Spearman correlation and testing a single-predictor ordinary least squares regression.
- Calculating power, required sample size, effect sizes, and corrections for multiple comparisons.

The decision helper can route repeated-checking cases to a sequential method when one exists, or explicitly report that no such route is available.

## Limitations and notes

The rigor-mcp MCP server does not replace assessment of whether a study design or data-generating process meets a method's assumptions. Its outputs include warnings, such as reliance on normality with small samples and low expected cell counts, so those warnings must be considered before interpreting a result.

Sequential methods are documented for two independent groups with continuous outcomes or proportions; other repeated-checking situations may not have a corresponding always-valid tool. Regression is limited to simple, single-predictor ordinary least squares. The package also provides calculations and guidance, not a general-purpose data collection or database integration layer.

_Full upstream README: https://allmcps.com/mcp/rigor-mcp/readme_

