{"name":"io.github.mrnh/rigor-mcp","slug":"mrnh-rigor-mcp","title":null,"description":"Verified statistical inference for AI agents: hypothesis tests, sequential testing, power.","url":"https://mcp.market/server/mrnh-rigor-mcp","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":18,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-09-17T07:59:57.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/mrnh/rigor","website":null,"version":"0.5.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"rigor-mcp","version":"0.5.0","runtimeHint":"uvx","transport":{"type":"stdio"}}],"tools":[{"name":"benjamini_hochberg_correction","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"bonferroni_correction","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"chi_square_goodness_of_fit","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"chi_square_independence","description":"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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"cohens_d","description":"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 m","write_action":false,"price_micros":0,"input_schema":null},{"name":"cohens_h","description":"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 no","write_action":false,"price_micros":0,"input_schema":null},{"name":"cramers_v","description":"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 t","write_action":false,"price_micros":0,"input_schema":null},{"name":"eta_squared","description":"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].","write_action":false,"price_micros":0,"input_schema":null},{"name":"fisher_exact_test","description":"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 rati","write_action":false,"price_micros":0,"input_schema":null},{"name":"kruskal_wallis","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"levene_test","description":"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 c","write_action":false,"price_micros":0,"input_schema":null},{"name":"mann_whitney_u","description":"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 f","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcnemar_exact_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcnemar_test","description":"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-correc","write_action":false,"price_micros":0,"input_schema":null},{"name":"naive_peeking_inflation","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"omega_squared","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"one_proportion_z_test","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"one_sample_t_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"one_way_anova","description":"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-","write_action":false,"price_micros":0,"input_schema":null},{"name":"paired_t_test","description":"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 f","write_action":false,"price_micros":0,"input_schema":null},{"name":"pairwise_group_comparisons","description":"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 resu","write_action":true,"price_micros":0,"input_schema":null},{"name":"pearson_correlation","description":"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","write_action":false,"price_micros":0,"input_schema":null},{"name":"power_for_one_sample_t_test","description":"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].","write_action":false,"price_micros":0,"input_schema":null},{"name":"power_for_two_proportion_test","description":"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].","write_action":false,"price_micros":0,"input_schema":null},{"name":"power_for_two_sample_t_test","description":"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 g","write_action":false,"price_micros":0,"input_schema":null},{"name":"rank_biserial_correlation","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"recommend_test","description":"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 --","write_action":false,"price_micros":0,"input_schema":null},{"name":"sample_size_for_one_sample_t_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sample_size_for_two_proportion_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sample_size_for_two_sample_t_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"sequential_two_proportion_test","description":"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 analy","write_action":false,"price_micros":0,"input_schema":null},{"name":"sequential_two_sample_mean_test","description":"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 dem","write_action":false,"price_micros":0,"input_schema":null},{"name":"simple_linear_regression","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"spearman_correlation","description":"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]).","write_action":false,"price_micros":0,"input_schema":null},{"name":"two_proportion_z_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"two_sample_t_test","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"wilcoxon_signed_rank","description":"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-).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-09-19T19:34:50.710Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:34:50.713Z","components":{"code":{"score":25,"max":25,"notes":["15 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"rigor-mcp","version":"0.5.0","found":true,"license":"MIT","dependencyCount":1,"publishedAt":"2026-09-17T08:01:09.400262Z","repositoryUrl":"https://github.com/mrnh/rigor"}],"repo":{"found":true,"owner":"mrnh","repo":"rigor","archived":false,"pushedAt":"2026-09-17T07:59:57Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/42982809?v=4","ownerCreatedAt":"2018-09-04T21:15:52Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-17T07:59:57.000Z","score":18}}}},"grade_history":[],"reviews":[]}