An SPSS-compatible MCP statistical assistant for social science research: data dictionary, metadata, frequencies, reliability, t-test, ANOVA, correlation, regression, chi-square, and more.
SAF MCP has 28 tools with inconsistent quality. Most tools have descriptions (good), but many lack proper parameter descriptions and output schemas. Tool naming is generally clear (verb_noun pattern: list_, inspect_, preview_, profile_, convert_, run_, generate_, export_). However, parameter documentation is sparse, many tools accept complex inputs (e.g., 'steps' as array of objects, 'analyses' as list of dicts) without describing the expected structure. Output schemas are not documented. Error handling is minimal. The server spans two code paths (src/saf_mcp/server.py and saf-mcp-blueprint/src/saf_mcp/server.py) with duplicate tool definitions, creating maintenance risk. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear read/write semantics.
Run one-way ANOVA.
Run chi-square test of independence for two categorical variables.
Prompt template to help a student choose the correct statistical test.
Convert CSV to SPSS .sav inside SAF_DATA_ROOT.
Convert a CSV or TSV file to .sav inside SAF_DATA_ROOT.
Convert SPSS .sav to CSV inside SAF_DATA_ROOT.
Convert a .sav, .zsav, or .por file to CSV inside SAF_DATA_ROOT.
Complex parameter types (array of objects, JSON strings) lack structural documentation. Tools like run_analysis_recipe accept 'steps' as array of dicts with 'kind' key, but no schema describes valid 'kind' values or required fields per kind.
Output schemas not documented. Tools return JSON dicts with 'ok', 'results', 'syntax', etc., but LLMs cannot infer what fields to expect or how to chain results to downstream tools.
Duplicate tool definitions across two code paths (src/saf_mcp/server.py and saf-mcp-blueprint/src/saf_mcp/server.py). Tools like list_data_files, inspect_dataset, convert_csv_to_sav appear in both. Maintenance risk and unclear which is canonical.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Run Pearson or Spearman correlation matrix.
Run Cronbach's alpha for Likert-scale items.
Run descriptive statistics for numeric variables.
Export results JSON into a Markdown report inside SAF_DATA_ROOT.
Run a frequency table for one variable.
Generate basic SPSS syntax without executing it.
Generate SPSS syntax text for common analyses. Does not execute SPSS.
Generate SPSS syntax for a specific analysis type.
Run Welch independent samples t-test.
SPSS-style data dictionary: variable names, labels, value labels, measure level, missing counts, data types, unique values, and suggested research role (IV, DV, grouping, scale_item, identifier). Works for .sav, .zsav, .por, .csv, .tsv, and .xlsx files.
Inspect dataset shape, variables, and SPSS metadata if available.
Inspect metadata for a .sav, .zsav, or .por file.
List supported dataset files under SAF_DATA_ROOT.
List CSV, Excel, and SPSS files inside SAF_DATA_ROOT.
Preview the first rows of a dataset.
Preview rows from a .sav, .zsav, or .por file.
Create a basic data dictionary and missing-data profile.
Profile variables in a .sav, .zsav, or .por file.
Run ordinary least squares regression.
Run a batch of analyses in one call. Each step is a dict with a ``kind`` key (e.g. ``descriptives``, ``reliability``, ``correlation``, ``regression``, ``compare_groups``, ``anova``, ``chi_square``, ``frequencies``, ``missing``, ``outliers``, ``assumptions``, ``describe_all``). Returns JSON results, APA interpretations, and optional SPSS syntax per step.
Run a reproducible analysis recipe. steps_json must be a JSON list.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools clearly split into READ_ONLY (inspect, preview, profile, generate, run) and WRITE (convert, export), but annotations are absent. Agents cannot infer safety properties.
Parameter descriptions missing or generic for complex inputs. 'variables' param in generate_spss_syntax_v2 is 'array of strings' but no guidance on valid variable names, case sensitivity, or how they map to dataset columns.