scitex 2.11.0__py3-none-any.whl → 2.13.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__main__.py +24 -5
- scitex/__version__.py +1 -1
- scitex/_optional_deps.py +33 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
- scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
- scitex/ai/plt/_plot_feature_importance.py +1 -1
- scitex/ai/plt/_plot_learning_curve.py +1 -1
- scitex/ai/plt/_plot_optuna_study.py +1 -1
- scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
- scitex/ai/plt/_plot_roc_curve.py +1 -1
- scitex/ai/plt/_stx_conf_mat.py +1 -1
- scitex/ai/training/_LearningCurveLogger.py +1 -1
- scitex/audio/mcp_server.py +38 -8
- scitex/browser/automation/CookieHandler.py +1 -1
- scitex/browser/core/BrowserMixin.py +1 -1
- scitex/browser/core/ChromeProfileManager.py +1 -1
- scitex/browser/debugging/_browser_logger.py +1 -1
- scitex/browser/debugging/_highlight_element.py +1 -1
- scitex/browser/debugging/_show_grid.py +1 -1
- scitex/browser/interaction/click_center.py +1 -1
- scitex/browser/interaction/click_with_fallbacks.py +1 -1
- scitex/browser/interaction/close_popups.py +1 -1
- scitex/browser/interaction/fill_with_fallbacks.py +1 -1
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
- scitex/browser/stealth/HumanBehavior.py +1 -1
- scitex/browser/stealth/StealthManager.py +1 -1
- scitex/canvas/_mcp_handlers.py +372 -0
- scitex/canvas/_mcp_tool_schemas.py +219 -0
- scitex/canvas/mcp_server.py +151 -0
- scitex/capture/mcp_server.py +41 -12
- scitex/cli/audio.py +233 -0
- scitex/cli/capture.py +307 -0
- scitex/cli/main.py +27 -4
- scitex/cli/repro.py +233 -0
- scitex/cli/resource.py +240 -0
- scitex/cli/stats.py +325 -0
- scitex/cli/template.py +236 -0
- scitex/cli/tex.py +286 -0
- scitex/cli/web.py +11 -12
- scitex/dev/__init__.py +3 -0
- scitex/dev/_pyproject.py +405 -0
- scitex/dev/plt/__init__.py +2 -2
- scitex/dev/plt/mpl/get_dir_ax.py +1 -1
- scitex/dev/plt/mpl/get_signatures.py +1 -1
- scitex/dev/plt/mpl/get_signatures_details.py +1 -1
- scitex/diagram/_mcp_handlers.py +400 -0
- scitex/diagram/_mcp_tool_schemas.py +157 -0
- scitex/diagram/mcp_server.py +151 -0
- scitex/dsp/_demo_sig.py +51 -5
- scitex/dsp/_mne.py +13 -2
- scitex/dsp/_modulation_index.py +15 -3
- scitex/dsp/_pac.py +23 -5
- scitex/dsp/_psd.py +16 -4
- scitex/dsp/_resample.py +24 -4
- scitex/dsp/_transform.py +16 -3
- scitex/dsp/add_noise.py +15 -1
- scitex/dsp/norm.py +17 -2
- scitex/dsp/reference.py +17 -1
- scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
- scitex/dsp/utils/_zero_pad.py +18 -4
- scitex/dt/_normalize_timestamp.py +1 -1
- scitex/git/_session.py +1 -1
- scitex/io/_load_modules/_con.py +12 -1
- scitex/io/_load_modules/_eeg.py +12 -1
- scitex/io/_load_modules/_optuna.py +21 -63
- scitex/io/_load_modules/_torch.py +11 -3
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
- scitex/io/_save_modules/_torch.py +11 -3
- scitex/mcp_server.py +159 -0
- scitex/plt/_mcp_handlers.py +361 -0
- scitex/plt/_mcp_tool_schemas.py +169 -0
- scitex/plt/mcp_server.py +205 -0
- scitex/repro/README_RandomStateManager.md +3 -3
- scitex/repro/_RandomStateManager.py +14 -14
- scitex/repro/_gen_ID.py +1 -1
- scitex/repro/_gen_timestamp.py +1 -1
- scitex/repro/_hash_array.py +4 -4
- scitex/scholar/__main__.py +24 -2
- scitex/scholar/_mcp_handlers.py +685 -0
- scitex/scholar/_mcp_tool_schemas.py +339 -0
- scitex/scholar/docs/template.py +1 -1
- scitex/scholar/examples/07_storage_integration.py +1 -1
- scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
- scitex/scholar/impact_factor/jcr/build_database.py +1 -1
- scitex/scholar/mcp_server.py +315 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
- scitex/scholar/storage/PaperIO.py +1 -1
- scitex/session/README.md +4 -4
- scitex/session/__init__.py +1 -1
- scitex/session/_decorator.py +9 -9
- scitex/session/_lifecycle.py +5 -5
- scitex/session/template.py +1 -1
- scitex/stats/__main__.py +281 -0
- scitex/stats/_mcp_handlers.py +1191 -0
- scitex/stats/_mcp_tool_schemas.py +384 -0
- scitex/stats/correct/_correct_bonferroni.py +1 -1
- scitex/stats/correct/_correct_fdr.py +1 -1
- scitex/stats/correct/_correct_fdr_.py +1 -1
- scitex/stats/correct/_correct_holm.py +1 -1
- scitex/stats/correct/_correct_sidak.py +1 -1
- scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
- scitex/stats/effect_sizes/_cohens_d.py +1 -1
- scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
- scitex/stats/effect_sizes/_eta_squared.py +1 -1
- scitex/stats/effect_sizes/_prob_superiority.py +1 -1
- scitex/stats/mcp_server.py +405 -0
- scitex/stats/posthoc/_dunnett.py +1 -1
- scitex/stats/posthoc/_games_howell.py +1 -1
- scitex/stats/posthoc/_tukey_hsd.py +1 -1
- scitex/stats/power/_power.py +1 -1
- scitex/stats/utils/_effect_size.py +1 -1
- scitex/stats/utils/_formatters.py +1 -1
- scitex/stats/utils/_power.py +1 -1
- scitex/template/_mcp_handlers.py +259 -0
- scitex/template/_mcp_tool_schemas.py +112 -0
- scitex/template/mcp_server.py +186 -0
- scitex/utils/_verify_scitex_format.py +2 -2
- scitex/utils/template.py +1 -1
- scitex/web/__init__.py +12 -11
- scitex/web/_scraping.py +26 -265
- scitex/web/download_images.py +316 -0
- scitex/writer/Writer.py +1 -1
- scitex/writer/_clone_writer_project.py +1 -1
- scitex/writer/_validate_tree_structures.py +1 -1
- scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
- scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
- scitex/writer/dataclasses/core/_Document.py +1 -1
- scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
- scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
- scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
- scitex/writer/utils/.legacy_git_retry.py +7 -5
- scitex/writer/utils/_parse_latex_logs.py +1 -1
- {scitex-2.11.0.dist-info → scitex-2.13.0.dist-info}/METADATA +431 -269
- {scitex-2.11.0.dist-info → scitex-2.13.0.dist-info}/RECORD +147 -118
- scitex-2.13.0.dist-info/entry_points.txt +11 -0
- scitex-2.11.0.dist-info/entry_points.txt +0 -2
- {scitex-2.11.0.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
- {scitex-2.11.0.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-08
|
|
3
|
+
# File: src/scitex/stats/mcp_server.py
|
|
4
|
+
# ----------------------------------------
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
MCP Server for SciTeX Stats - Statistical Testing Framework
|
|
8
|
+
|
|
9
|
+
Provides tools for:
|
|
10
|
+
- Recommending appropriate statistical tests
|
|
11
|
+
- Running statistical tests
|
|
12
|
+
- Formatting results for publication
|
|
13
|
+
- Power analysis and sample size calculation
|
|
14
|
+
- Multiple comparison correction
|
|
15
|
+
- Descriptive statistics
|
|
16
|
+
- Effect size calculation
|
|
17
|
+
- Normality testing
|
|
18
|
+
- Post-hoc comparisons
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import asyncio
|
|
24
|
+
|
|
25
|
+
# Graceful MCP dependency handling
|
|
26
|
+
try:
|
|
27
|
+
import mcp.types as types
|
|
28
|
+
from mcp.server import NotificationOptions, Server
|
|
29
|
+
from mcp.server.models import InitializationOptions
|
|
30
|
+
from mcp.server.stdio import stdio_server
|
|
31
|
+
|
|
32
|
+
MCP_AVAILABLE = True
|
|
33
|
+
except ImportError:
|
|
34
|
+
MCP_AVAILABLE = False
|
|
35
|
+
types = None # type: ignore
|
|
36
|
+
Server = None # type: ignore
|
|
37
|
+
NotificationOptions = None # type: ignore
|
|
38
|
+
InitializationOptions = None # type: ignore
|
|
39
|
+
stdio_server = None # type: ignore
|
|
40
|
+
|
|
41
|
+
__all__ = ["StatsServer", "main", "MCP_AVAILABLE"]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class StatsServer:
|
|
45
|
+
"""MCP Server for Statistical Testing Framework."""
|
|
46
|
+
|
|
47
|
+
def __init__(self):
|
|
48
|
+
self.server = Server("scitex-stats")
|
|
49
|
+
self.setup_handlers()
|
|
50
|
+
|
|
51
|
+
def setup_handlers(self):
|
|
52
|
+
"""Set up MCP server handlers."""
|
|
53
|
+
from ._mcp_handlers import (
|
|
54
|
+
correct_pvalues_handler,
|
|
55
|
+
describe_handler,
|
|
56
|
+
effect_size_handler,
|
|
57
|
+
format_results_handler,
|
|
58
|
+
normality_test_handler,
|
|
59
|
+
p_to_stars_handler,
|
|
60
|
+
posthoc_test_handler,
|
|
61
|
+
power_analysis_handler,
|
|
62
|
+
recommend_tests_handler,
|
|
63
|
+
run_test_handler,
|
|
64
|
+
)
|
|
65
|
+
from ._mcp_tool_schemas import get_tool_schemas
|
|
66
|
+
|
|
67
|
+
@self.server.list_tools()
|
|
68
|
+
async def handle_list_tools():
|
|
69
|
+
return get_tool_schemas()
|
|
70
|
+
|
|
71
|
+
@self.server.call_tool()
|
|
72
|
+
async def handle_call_tool(name: str, arguments: dict):
|
|
73
|
+
# Test Recommendation
|
|
74
|
+
if name == "recommend_tests":
|
|
75
|
+
return await self._wrap_result(recommend_tests_handler(**arguments))
|
|
76
|
+
|
|
77
|
+
# Run Statistical Test
|
|
78
|
+
elif name == "run_test":
|
|
79
|
+
return await self._wrap_result(run_test_handler(**arguments))
|
|
80
|
+
|
|
81
|
+
# Format Results
|
|
82
|
+
elif name == "format_results":
|
|
83
|
+
return await self._wrap_result(format_results_handler(**arguments))
|
|
84
|
+
|
|
85
|
+
# Power Analysis
|
|
86
|
+
elif name == "power_analysis":
|
|
87
|
+
return await self._wrap_result(power_analysis_handler(**arguments))
|
|
88
|
+
|
|
89
|
+
# Correct P-values
|
|
90
|
+
elif name == "correct_pvalues":
|
|
91
|
+
return await self._wrap_result(correct_pvalues_handler(**arguments))
|
|
92
|
+
|
|
93
|
+
# Descriptive Statistics
|
|
94
|
+
elif name == "describe":
|
|
95
|
+
return await self._wrap_result(describe_handler(**arguments))
|
|
96
|
+
|
|
97
|
+
# Effect Size
|
|
98
|
+
elif name == "effect_size":
|
|
99
|
+
return await self._wrap_result(effect_size_handler(**arguments))
|
|
100
|
+
|
|
101
|
+
# Normality Test
|
|
102
|
+
elif name == "normality_test":
|
|
103
|
+
return await self._wrap_result(normality_test_handler(**arguments))
|
|
104
|
+
|
|
105
|
+
# Post-hoc Test
|
|
106
|
+
elif name == "posthoc_test":
|
|
107
|
+
return await self._wrap_result(posthoc_test_handler(**arguments))
|
|
108
|
+
|
|
109
|
+
# P-value to Stars
|
|
110
|
+
elif name == "p_to_stars":
|
|
111
|
+
return await self._wrap_result(p_to_stars_handler(**arguments))
|
|
112
|
+
|
|
113
|
+
else:
|
|
114
|
+
raise ValueError(f"Unknown tool: {name}")
|
|
115
|
+
|
|
116
|
+
@self.server.list_resources()
|
|
117
|
+
async def handle_list_resources():
|
|
118
|
+
"""List available statistical resources."""
|
|
119
|
+
resources = [
|
|
120
|
+
types.Resource(
|
|
121
|
+
uri="stats://tests/parametric",
|
|
122
|
+
name="Parametric Tests",
|
|
123
|
+
description="List of available parametric statistical tests",
|
|
124
|
+
mimeType="application/json",
|
|
125
|
+
),
|
|
126
|
+
types.Resource(
|
|
127
|
+
uri="stats://tests/nonparametric",
|
|
128
|
+
name="Non-parametric Tests",
|
|
129
|
+
description="List of available non-parametric statistical tests",
|
|
130
|
+
mimeType="application/json",
|
|
131
|
+
),
|
|
132
|
+
types.Resource(
|
|
133
|
+
uri="stats://effect-sizes",
|
|
134
|
+
name="Effect Size Measures",
|
|
135
|
+
description="Available effect size calculations",
|
|
136
|
+
mimeType="application/json",
|
|
137
|
+
),
|
|
138
|
+
types.Resource(
|
|
139
|
+
uri="stats://correction-methods",
|
|
140
|
+
name="Multiple Comparison Methods",
|
|
141
|
+
description="Available p-value correction methods",
|
|
142
|
+
mimeType="application/json",
|
|
143
|
+
),
|
|
144
|
+
]
|
|
145
|
+
return resources
|
|
146
|
+
|
|
147
|
+
@self.server.read_resource()
|
|
148
|
+
async def handle_read_resource(uri: str):
|
|
149
|
+
"""Read a statistical resource."""
|
|
150
|
+
import json
|
|
151
|
+
|
|
152
|
+
if uri == "stats://tests/parametric":
|
|
153
|
+
content = json.dumps(
|
|
154
|
+
{
|
|
155
|
+
"tests": [
|
|
156
|
+
{
|
|
157
|
+
"name": "ttest_ind",
|
|
158
|
+
"description": "Independent samples t-test",
|
|
159
|
+
"groups": 2,
|
|
160
|
+
"assumptions": ["normality", "equal_variance"],
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"name": "ttest_paired",
|
|
164
|
+
"description": "Paired samples t-test",
|
|
165
|
+
"groups": 2,
|
|
166
|
+
"assumptions": ["normality"],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"name": "ttest_1samp",
|
|
170
|
+
"description": "One-sample t-test",
|
|
171
|
+
"groups": 1,
|
|
172
|
+
"assumptions": ["normality"],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"name": "anova",
|
|
176
|
+
"description": "One-way ANOVA",
|
|
177
|
+
"groups": "2+",
|
|
178
|
+
"assumptions": ["normality", "equal_variance"],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "pearson",
|
|
182
|
+
"description": "Pearson correlation",
|
|
183
|
+
"groups": 2,
|
|
184
|
+
"assumptions": ["normality", "linearity"],
|
|
185
|
+
},
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
indent=2,
|
|
189
|
+
)
|
|
190
|
+
return types.TextResourceContents(
|
|
191
|
+
uri=uri,
|
|
192
|
+
mimeType="application/json",
|
|
193
|
+
text=content,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
elif uri == "stats://tests/nonparametric":
|
|
197
|
+
content = json.dumps(
|
|
198
|
+
{
|
|
199
|
+
"tests": [
|
|
200
|
+
{
|
|
201
|
+
"name": "brunner_munzel",
|
|
202
|
+
"description": "Brunner-Munzel test (recommended)",
|
|
203
|
+
"groups": 2,
|
|
204
|
+
"assumptions": [],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"name": "mannwhitneyu",
|
|
208
|
+
"description": "Mann-Whitney U test",
|
|
209
|
+
"groups": 2,
|
|
210
|
+
"assumptions": [],
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"name": "wilcoxon",
|
|
214
|
+
"description": "Wilcoxon signed-rank test",
|
|
215
|
+
"groups": 2,
|
|
216
|
+
"assumptions": ["paired"],
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"name": "kruskal",
|
|
220
|
+
"description": "Kruskal-Wallis H test",
|
|
221
|
+
"groups": "2+",
|
|
222
|
+
"assumptions": [],
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"name": "spearman",
|
|
226
|
+
"description": "Spearman rank correlation",
|
|
227
|
+
"groups": 2,
|
|
228
|
+
"assumptions": [],
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"name": "kendall",
|
|
232
|
+
"description": "Kendall tau correlation",
|
|
233
|
+
"groups": 2,
|
|
234
|
+
"assumptions": [],
|
|
235
|
+
},
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
indent=2,
|
|
239
|
+
)
|
|
240
|
+
return types.TextResourceContents(
|
|
241
|
+
uri=uri,
|
|
242
|
+
mimeType="application/json",
|
|
243
|
+
text=content,
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
elif uri == "stats://effect-sizes":
|
|
247
|
+
content = json.dumps(
|
|
248
|
+
{
|
|
249
|
+
"measures": [
|
|
250
|
+
{
|
|
251
|
+
"name": "cohens_d",
|
|
252
|
+
"description": "Cohen's d - standardized mean difference",
|
|
253
|
+
"type": "parametric",
|
|
254
|
+
"interpretation": {
|
|
255
|
+
"small": 0.2,
|
|
256
|
+
"medium": 0.5,
|
|
257
|
+
"large": 0.8,
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"name": "hedges_g",
|
|
262
|
+
"description": "Hedges' g - bias-corrected Cohen's d",
|
|
263
|
+
"type": "parametric",
|
|
264
|
+
"interpretation": {
|
|
265
|
+
"small": 0.2,
|
|
266
|
+
"medium": 0.5,
|
|
267
|
+
"large": 0.8,
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"name": "glass_delta",
|
|
272
|
+
"description": "Glass's delta - using control group SD",
|
|
273
|
+
"type": "parametric",
|
|
274
|
+
"interpretation": {
|
|
275
|
+
"small": 0.2,
|
|
276
|
+
"medium": 0.5,
|
|
277
|
+
"large": 0.8,
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"name": "cliffs_delta",
|
|
282
|
+
"description": "Cliff's delta - nonparametric effect size",
|
|
283
|
+
"type": "nonparametric",
|
|
284
|
+
"interpretation": {
|
|
285
|
+
"negligible": 0.147,
|
|
286
|
+
"small": 0.33,
|
|
287
|
+
"medium": 0.474,
|
|
288
|
+
"large": 0.474,
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
]
|
|
292
|
+
},
|
|
293
|
+
indent=2,
|
|
294
|
+
)
|
|
295
|
+
return types.TextResourceContents(
|
|
296
|
+
uri=uri,
|
|
297
|
+
mimeType="application/json",
|
|
298
|
+
text=content,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
elif uri == "stats://correction-methods":
|
|
302
|
+
content = json.dumps(
|
|
303
|
+
{
|
|
304
|
+
"methods": [
|
|
305
|
+
{
|
|
306
|
+
"name": "bonferroni",
|
|
307
|
+
"description": "Bonferroni correction (FWER control)",
|
|
308
|
+
"conservative": True,
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"name": "holm",
|
|
312
|
+
"description": "Holm-Bonferroni step-down (FWER control)",
|
|
313
|
+
"conservative": True,
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"name": "sidak",
|
|
317
|
+
"description": "Sidak correction (FWER control)",
|
|
318
|
+
"conservative": True,
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"name": "fdr_bh",
|
|
322
|
+
"description": "Benjamini-Hochberg (FDR control)",
|
|
323
|
+
"conservative": False,
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"name": "fdr_by",
|
|
327
|
+
"description": "Benjamini-Yekutieli (FDR control)",
|
|
328
|
+
"conservative": False,
|
|
329
|
+
},
|
|
330
|
+
]
|
|
331
|
+
},
|
|
332
|
+
indent=2,
|
|
333
|
+
)
|
|
334
|
+
return types.TextResourceContents(
|
|
335
|
+
uri=uri,
|
|
336
|
+
mimeType="application/json",
|
|
337
|
+
text=content,
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
else:
|
|
341
|
+
raise ValueError(f"Unknown resource URI: {uri}")
|
|
342
|
+
|
|
343
|
+
async def _wrap_result(self, coro):
|
|
344
|
+
"""Wrap handler result as MCP TextContent."""
|
|
345
|
+
import json
|
|
346
|
+
|
|
347
|
+
try:
|
|
348
|
+
result = await coro
|
|
349
|
+
return [
|
|
350
|
+
types.TextContent(
|
|
351
|
+
type="text",
|
|
352
|
+
text=json.dumps(result, indent=2, default=str),
|
|
353
|
+
)
|
|
354
|
+
]
|
|
355
|
+
except Exception as e:
|
|
356
|
+
return [
|
|
357
|
+
types.TextContent(
|
|
358
|
+
type="text",
|
|
359
|
+
text=json.dumps({"success": False, "error": str(e)}, indent=2),
|
|
360
|
+
)
|
|
361
|
+
]
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
async def _run_server():
|
|
365
|
+
"""Run the MCP server (internal)."""
|
|
366
|
+
server = StatsServer()
|
|
367
|
+
async with stdio_server() as (read_stream, write_stream):
|
|
368
|
+
await server.server.run(
|
|
369
|
+
read_stream,
|
|
370
|
+
write_stream,
|
|
371
|
+
InitializationOptions(
|
|
372
|
+
server_name="scitex-stats",
|
|
373
|
+
server_version="0.1.0",
|
|
374
|
+
capabilities=server.server.get_capabilities(
|
|
375
|
+
notification_options=NotificationOptions(),
|
|
376
|
+
experimental_capabilities={},
|
|
377
|
+
),
|
|
378
|
+
),
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def main():
|
|
383
|
+
"""Main entry point for the MCP server."""
|
|
384
|
+
if not MCP_AVAILABLE:
|
|
385
|
+
import sys
|
|
386
|
+
|
|
387
|
+
print("=" * 60)
|
|
388
|
+
print("MCP Server 'scitex-stats' requires the 'mcp' package.")
|
|
389
|
+
print()
|
|
390
|
+
print("Install with:")
|
|
391
|
+
print(" pip install mcp")
|
|
392
|
+
print()
|
|
393
|
+
print("Or install scitex with MCP support:")
|
|
394
|
+
print(" pip install scitex[mcp]")
|
|
395
|
+
print("=" * 60)
|
|
396
|
+
sys.exit(1)
|
|
397
|
+
|
|
398
|
+
asyncio.run(_run_server())
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
if __name__ == "__main__":
|
|
402
|
+
main()
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
# EOF
|
scitex/stats/posthoc/_dunnett.py
CHANGED
|
@@ -332,7 +332,7 @@ if __name__ == "__main__":
|
|
|
332
332
|
parser = argparse.ArgumentParser()
|
|
333
333
|
args = parser.parse_args([])
|
|
334
334
|
|
|
335
|
-
CONFIG, sys.stdout, sys.stderr, plt, CC,
|
|
335
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
|
|
336
336
|
sys=sys,
|
|
337
337
|
plt=None,
|
|
338
338
|
args=args,
|
|
@@ -283,7 +283,7 @@ if __name__ == "__main__":
|
|
|
283
283
|
parser = argparse.ArgumentParser()
|
|
284
284
|
args = parser.parse_args([])
|
|
285
285
|
|
|
286
|
-
CONFIG, sys.stdout, sys.stderr, plt, CC,
|
|
286
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
|
|
287
287
|
sys=sys,
|
|
288
288
|
plt=None,
|
|
289
289
|
args=args,
|
|
@@ -282,7 +282,7 @@ if __name__ == "__main__":
|
|
|
282
282
|
parser = argparse.ArgumentParser()
|
|
283
283
|
args = parser.parse_args([])
|
|
284
284
|
|
|
285
|
-
CONFIG, sys.stdout, sys.stderr, plt, CC,
|
|
285
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
|
|
286
286
|
sys=sys,
|
|
287
287
|
plt=None,
|
|
288
288
|
args=args,
|
scitex/stats/power/_power.py
CHANGED
scitex/stats/utils/_power.py
CHANGED