Extensible, domain-agnostic predictive analytics platform with MCP integration for dataset analysis, model training, predictions, and explanations
Anistroph demonstrates solid tool design with 14 well-named, action-verb-prefixed tools (list_, get_, slice_, compare_, find_, predict_, explain_, sample_, search_). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas are present and properly typed with JSON Schema. However, parameter descriptions are sparse or missing entirely, most parameters lack explanatory text beyond the name. Output schemas are undocumented; LLMs cannot predict what fields to expect from responses. Error handling is absent from visible code. Tool composition is strong (each does one thing; names are distinct and clear). Security posture is good (read-only operations, no exposed secrets in params). Naming follows verb_noun convention well.
Compare a metric across values of a dimension.
Explain a prediction using SHAP TreeExplainer (for XGBoost models) or importance-weighted contributions. Returns top_positive (features that increase the prediction) and top_negative (features that decrease it), plus a combined top_drivers list. For temporal datasets, provide entity_id and timestamp. For non-temporal datasets, provide entity_id.
Find slices with the largest deviation from the overall metric baseline. Searches 1, 2, and 3-dimensional combinations of categorical columns.
Get the prediction input schema for a trained model — what the caller must supply to predict. Returns the prediction mode (entity_id lookup vs records), the entity_key, whether a timestamp is required, and (for records-based prediction) the list of required source columns with their types and transforms. Use this before calling anistroph_predict to discover what inputs a model expects.
Get the evaluation metrics for a trained model.
Parameter descriptions are missing or minimal. Most parameters (e.g., 'dataset_id', 'metric', 'aggregation', 'filters', 'limit') lack explanatory text. LLMs cannot infer whether 'aggregation' accepts 'mean|sum|count' or free-form strings, or what 'filters' object structure should be.
Output schemas are not documented. Tools return data but LLMs have no specification of response structure, field names, or types. This forces LLMs to guess what fields exist and risks failed downstream tool chaining.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Return the self-describing search contract for a dataset that has a 'search:' configuration. Lists searchable fields (with types, units, supported operators, aliases, categorical values or numeric ranges from the live profile) and semantic filters (e.g. operating_temperature, industrial_temperature). Use this before anistroph_search to discover what filters and field names are available for a dataset.
List all registered datasets in Anistroph.
List all registered trained models in Anistroph.
Make a prediction using a trained model. For temporal datasets, provide entity_id and timestamp. For non-temporal datasets, provide records.
Search a catalog dataset, then predict for each matching product using a trained model. Runs a parametric search (same as anistroph_search) on the catalog dataset, then for each matching product_id invokes the specified model using entity-lookup prediction against the model's temporal supply dataset. Results are enriched with the prediction and ranked by prediction outcome (descending: highest risk probability or longest lead time first).
Profile a registered dataset (row count, column types, distributions, time range, event distribution).
Return up to n raw rows from a registered dataset, optionally filtered by column values, with an optional column subset and sort. Use this to inspect individual records (e.g. a specific wafer_id) rather than aggregations. n is capped at 1000.
Run a deterministic structured search over a dataset. Supports operators eq, in, gte, lte, between, and contains_range. Semantic filter names (from the search contract) can be used as the field — they expand to deterministic predicates (e.g. operating_temperature with value 55 becomes min<=55 AND max>=55). Returns matching rows plus an applied_filters audit of the normalized query. limit is capped at 1000. Use anistroph_get_search_contract first to discover field names, operators, and semantic filters.
Slice a dataset by dimensions with an aggregation over a metric.
No error handling guidance. Tools do not document what errors can occur, whether they are retryable, or what the LLM should do next. A failed prediction or search returns no recovery hint.
Complex parameter structures (filters, sort) lack schema detail. 'filters' is typed as 'object' with no properties defined; 'sort' in anistroph_search is an array of objects but the object schema is incomplete. LLMs cannot construct valid filter/sort payloads without trial and error.
Enum constraints missing for string parameters. 'aggregation' accepts 'mean|sum|count|...' but is not declared as an enum; 'op' in anistroph_search lists operators in description but not as enum. Free-form strings invite hallucinated values.