MCP Tool Reference¶
Cursus exposes a framework-neutral, JSON-in/JSON-out agent tool surface of 70 tools across 12 namespaces (with 163 worked examples). This page is generated from the live cursus.mcp.registry, so it always matches the installed toolset.
Invoke tools programmatically with cursus.mcp.registry.call_tool(name, args), over the MCP server (cursus-mcp / python -m cursus.mcp.server), or inspect them with cursus mcp help / the tools.help tool.
On an MCP host, each tool is exposed under a host-legal wire name (dots become __, e.g. catalog__list_steps) because host tool-calling APIs reject .; the dotted names below are the human-facing form, and both resolve to the same tool. The server is read-only by default — tools marked destructive / writes / exec_code below are exposed only when the operator opts in with CURSUS_MCP_ENABLE_DESTRUCTIVE=1 (filesystem writes + AWS upserts) or CURSUS_MCP_ALLOW_SCRIPT_EXEC=1 (running step scripts).
catalog¶
Discover/search steps, configs, and builders (step_catalog + registry).
catalog.config_fields¶
MCP wire name: catalog__config_fields
List the configuration fields (name, type, required, default, description) of a step’s config class. Use to learn what config a step expects.
When: Call when you need to know which configuration fields a step expects (names, types, required flags, defaults) before writing its config.
Examples:
catalog.config_fields {“step_name”: “XGBoostTraining”} # config schema for the training step
catalog.config_fields {“step_name”: “TabularPreprocessing”} # fields of the preprocessing config class
(tags: planner, programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name whose config class fields to list. |
catalog.help¶
MCP wire name: catalog__help
Overview of the ‘catalog’ tools — Discover/search steps, configs, and builders (step_catalog + registry). Returns each catalog.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using catalog tools.
When: You are about to work with catalog tools and want that namespace’s overview + examples.
Examples:
catalog.help {} # every catalog.* tool with when + examples
catalog.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
catalog.list_builders¶
MCP wire name: catalog__list_builders
List builder class names (no instantiation), optionally filtered by SageMaker step type (e.g. ‘Processing’, ‘Training’, ‘Transform’).
When: Call when you want the builder class names available, optionally narrowed to a single SageMaker step type (e.g. all Processing builders).
Examples:
catalog.list_builders {} # every builder class, grouped by step name
catalog.list_builders {“sagemaker_step_type”: “Processing”} # only Processing-step builders
catalog.list_builders {“sagemaker_step_type”: “Training”} # only Training-step builders
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Optional SageMaker step type filter (Processing, Training, Transform, CreateModel, …). |
catalog.list_steps¶
MCP wire name: catalog__list_steps
List the concrete pipeline step names known to cursus. Call this to discover what steps are available before planning or building a pipeline.
When: Call this first when you need to see what pipeline steps exist before planning a DAG or looking up a specific step.
Examples:
catalog.list_steps {} # every step known to cursus
catalog.list_steps {“job_type”: “training”} # only training-variant steps
catalog.list_steps {“workspace_id”: “core”, “job_type”: “calibration”} # scope to a workspace + job type
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Optional workspace filter; omit for package-scope steps. |
|
string |
no |
Optional job-type filter (e.g. ‘training’, ‘validation’). |
catalog.resolve_step¶
MCP wire name: catalog__resolve_step
Resolve a step name (canonical or file-style like ‘model_evaluation_xgb’) to its config class, builder class, spec type, and SageMaker step type.
When: Call when you have a step name (canonical or file-style) and need its concrete registered classes: config, builder, spec type, SageMaker type.
Examples:
catalog.resolve_step {“step_name”: “XGBoostTraining”} # resolve a canonical name to its classes
catalog.resolve_step {“step_name”: “model_evaluation_xgb”} # map a file-style name to XGBoostModelEval
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical or file-style step name to resolve. |
catalog.search¶
MCP wire name: catalog__search
Fuzzy-search steps by name and return scored matches with the component types available for each. Use when you have a partial/approximate step name.
When: Call when you only know a partial or approximate step name and need scored candidate matches to pick the exact canonical name.
Examples:
catalog.search {“query”: “xgboost”} # all steps whose name matches “xgboost”
catalog.search {“query”: “preprocess”} # find TabularPreprocessing and friends
catalog.search {“query”: “eval”, “job_type”: “training”} # matches scoped to training-variant steps
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Search substring to match against step names. |
|
string |
no |
Optional job-type filter (e.g. ‘training’). |
catalog.step_info¶
MCP wire name: catalog__step_info
Get full details for one step: registry data, config/builder names, SageMaker step type, detected framework, and which components exist.
When: Call when you have an exact step name and need its naming metadata (config/builder names, SageMaker type, framework, available components).
Examples:
catalog.step_info {“step_name”: “XGBoostTraining”} # full metadata for one step
catalog.step_info {“step_name”: “TabularPreprocessing”, “job_type”: “training”} # info for a job-type variant
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name (PascalCase, e.g. ‘XGBoostTraining’). |
|
string |
no |
Optional job-type variant (e.g. ‘training’). |
catalog.step_spec¶
MCP wire name: catalog__step_spec
Get a step’s full specification — its declared dependencies (input ports, with compatible sources + semantic keywords) and outputs (output ports, with property paths). Use this to understand a step’s I/O contract before wiring it into a DAG. (catalog.step_info gives naming/components; this gives ports.)
When: Call before wiring a step into a DAG, when you need its I/O contract — the declared dependency (input) ports and output ports, not just its names.
Examples:
catalog.step_spec {“step_name”: “XGBoostTraining”} # dependencies + outputs for wiring edges
catalog.step_spec {“step_name”: “XGBoostModelEval”} # ports of the eval step to connect its inputs
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name (PascalCase, e.g. ‘XGBoostTraining’). |
compile¶
Compile/validate/preview a DAG into a SageMaker pipeline (core.compiler).
compile.dag¶
MCP wire name: compile__dag
Compile a DAG + config file into a SageMaker pipeline definition and return its name and step count. Build-only by default; set upsert=true (requires role) to push the pipeline to SageMaker (mutates external state).
When: Call this once validation/preview look good to build the SageMaker pipeline definition; only set upsert=true when you intend to push it to SageMaker.
Examples:
compile.dag {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”} # build-only: compile the pipeline definition, no upsert
compile.dag {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”, “pipeline_name”: “xgboost-training”} # build-only with a name override
compile.dag {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”, “role”: “arn:aws:iam::123456789012:role/SageMakerRole”, “upsert”: true} # DESTRUCTIVE: upserts the pipeline into SageMaker (needs role)
(destructive · network · tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
no |
Pipeline DAG topology. Either the flat form {‘nodes’: […], ‘edges’: [[src, dst], …]} or the serializer form {‘dag’: {‘nodes’: […], ‘edges’: […]}}. Provide this OR ‘dag_file’, not both. |
|
string |
no |
Path to a serialized DAG JSON file (loaded via import_dag_from_json). Provide this OR ‘dag’. |
|
string |
yes |
Path to the pipeline configuration JSON file. |
|
string |
no |
Optional IAM role ARN for the SageMaker pipeline. |
|
string |
no |
Optional pipeline name override. |
|
boolean |
no |
If true, upsert the compiled pipeline to SageMaker (destructive). Requires ‘role’. Default false (build only). |
compile.help¶
MCP wire name: compile__help
Overview of the ‘compile’ tools — Compile/validate/preview a DAG into a SageMaker pipeline (core.compiler). Returns each compile.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using compile tools.
When: You are about to work with compile tools and want that namespace’s overview + examples.
Examples:
compile.help {} # every compile.* tool with when + examples
compile.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
compile.name¶
MCP wire name: compile__name
Pure string helper for SageMaker pipeline names. Pass ‘base’ to generate a valid name (’
When: Call this to generate a SageMaker-valid pipeline name from a base string, or to sanitize/validate an arbitrary name before using it as pipeline_name.
Examples:
compile.name {“base”: “xgboost-training”} # generate “xgboost-training-1.0-pipeline”
compile.name {“base”: “xgboost training”, “version”: “2.1”} # generate with a specific version segment
compile.name {“sanitize”: “My Pipeline!! v3”} # clean an arbitrary string into a valid name
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Base name to generate a pipeline name from. |
|
string |
no |
Version segment for the generated name (default ‘1.0’). |
|
string |
no |
An arbitrary name to sanitize to SageMaker constraints. |
compile.preview¶
MCP wire name: compile__preview
Preview how each DAG node will resolve to a config type and step builder, including per-node confidence scores, ambiguities, and recommendations. Non-destructive; use to inspect resolution before compiling.
When: Call this to inspect the node->config->builder mapping, confidence scores, and ambiguities before compiling — especially when compile.validate reported unresolved nodes.
Examples:
compile.preview {“config_file”: “config/pipeline_config.json”, “dag”: {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]}} # preview resolution of an inline DAG
compile.preview {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”} # preview resolution of a DAG from file
(tags: planner, validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
no |
Pipeline DAG topology. Either the flat form {‘nodes’: […], ‘edges’: [[src, dst], …]} or the serializer form {‘dag’: {‘nodes’: […], ‘edges’: […]}}. Provide this OR ‘dag_file’, not both. |
|
string |
no |
Path to a serialized DAG JSON file (loaded via import_dag_from_json). Provide this OR ‘dag’. |
|
string |
yes |
Path to the pipeline configuration JSON file. |
|
string |
no |
Optional IAM role ARN for the SageMaker pipeline. |
compile.single_node¶
MCP wire name: compile__single_node
Compile an isolated, single-node pipeline for one DAG node using manual S3 input overrides — useful to re-run one failed step without rerunning upstream steps. Build-only (does not start/upsert).
When: Call this to re-run a single failed DAG node in isolation by supplying its upstream S3 inputs manually, instead of recompiling the whole pipeline.
Examples:
compile.single_node {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”, “target_node”: “XGBoostTraining”, “manual_inputs”: {“input_path”: “s3://my-bucket/run-1/preprocessing/output/”}} # isolate XGBoostTraining with a manual S3 input
compile.single_node {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”, “target_node”: “TabularPreprocessing”, “manual_inputs”: {“data_input”: “s3://my-bucket/raw/”}, “pipeline_name”: “tab-preproc-isolated”, “validate_inputs”: false} # isolate a node, skip input validation, custom name
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
no |
Pipeline DAG topology. Either the flat form {‘nodes’: […], ‘edges’: [[src, dst], …]} or the serializer form {‘dag’: {‘nodes’: […], ‘edges’: […]}}. Provide this OR ‘dag_file’, not both. |
|
string |
no |
Path to a serialized DAG JSON file (loaded via import_dag_from_json). Provide this OR ‘dag’. |
|
string |
yes |
Path to the pipeline configuration JSON file. |
|
string |
no |
Optional IAM role ARN for the SageMaker pipeline. |
|
string |
yes |
Name of the DAG node to compile in isolation. |
|
object |
yes |
Map of logical input name -> S3 URI (e.g. {“input_path”: “s3://bucket/run-1/output/”}). |
|
string |
no |
Optional pipeline name (default ‘ |
|
boolean |
no |
Validate node existence + S3 URIs first. Default true. |
compile.validate¶
MCP wire name: compile__validate
Validate that a DAG’s nodes can be resolved to configs and step builders for a given config file. Call before compiling to catch missing configs or unresolvable builders. Returns is_valid, missing_configs, unresolvable_builders, config_errors, dependency_issues, warnings.
When: Call this before compiling to confirm every DAG node resolves to a config and a step builder for the given config_file.
Examples:
compile.validate {“config_file”: “config/pipeline_config.json”, “dag”: {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]}} # validate an inline DAG
compile.validate {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”} # validate a DAG loaded from a JSON file
compile.validate {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”, “role”: “arn:aws:iam::123456789012:role/SageMakerRole”} # validate with an explicit IAM role
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
no |
Pipeline DAG topology. Either the flat form {‘nodes’: […], ‘edges’: [[src, dst], …]} or the serializer form {‘dag’: {‘nodes’: […], ‘edges’: […]}}. Provide this OR ‘dag_file’, not both. |
|
string |
no |
Path to a serialized DAG JSON file (loaded via import_dag_from_json). Provide this OR ‘dag’. |
|
string |
yes |
Path to the pipeline configuration JSON file. |
|
string |
no |
Optional IAM role ARN for the SageMaker pipeline. |
compile.with_report¶
MCP wire name: compile__with_report
Compile a DAG + config file into a pipeline and return a detailed ConversionReport: pipeline_name, steps, avg_confidence, resolution_details, and warnings. Non-destructive (builds the definition, never upserts).
When: Call this instead of compile.dag when you want a detailed ConversionReport (per-node resolution_details, avg_confidence, warnings) without any risk of upserting.
Examples:
compile.with_report {“config_file”: “config/pipeline_config.json”, “dag_file”: “config/dag.json”} # compile and return the full ConversionReport
compile.with_report {“config_file”: “config/pipeline_config.json”, “dag”: {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]}, “pipeline_name”: “xgboost-training”} # report for an inline DAG with a name override
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
no |
Pipeline DAG topology. Either the flat form {‘nodes’: […], ‘edges’: [[src, dst], …]} or the serializer form {‘dag’: {‘nodes’: […], ‘edges’: […]}}. Provide this OR ‘dag_file’, not both. |
|
string |
no |
Path to a serialized DAG JSON file (loaded via import_dag_from_json). Provide this OR ‘dag’. |
|
string |
yes |
Path to the pipeline configuration JSON file. |
|
string |
no |
Optional IAM role ARN for the SageMaker pipeline. |
|
string |
no |
Optional pipeline name override. |
config¶
Schema-driven config generation and loading (api.factory + core.config_fields).
config.field_info¶
MCP wire name: config__field_info
Return the field requirements (name, type, description, required, default) for a single named config class, e.g. ‘TabularPreprocessingConfig’. Pass categorized=true to split into required vs optional. Use to inspect one step’s config in detail.
When: Call this when you know a specific config class name and want its full field list (types, defaults, required flags) without resolving a whole DAG.
Examples:
config.field_info {“config_class”: “XGBoostTrainingConfig”} # all fields for XGBoost training config
config.field_info {“config_class”: “TabularPreprocessingConfig”, “categorized”: true} # split into required vs optional
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Config class name to introspect (e.g. ‘XGBoostTrainingConfig’). |
|
boolean |
no |
If true, return separate ‘required’ and ‘optional’ field lists. |
config.help¶
MCP wire name: config__help
Overview of the ‘config’ tools — Schema-driven config generation and loading (api.factory + core.config_fields). Returns each config.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using config tools.
When: You are about to work with config tools and want that namespace’s overview + examples.
Examples:
config.help {} # every config.* tool with when + examples
config.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
config.load¶
MCP wire name: config__load
Load a saved merged-config JSON file and return a JSON-safe summary: shared field names and per-step field names/counts. Use to inspect what a previously saved config file contains without loading full values.
When: Call this when you have a saved merged-config JSON file on disk and want to inspect which shared and per-step fields it holds without loading full values.
Examples:
config.load {“path”: “config/config_xgboost.json”} # summarize a saved merged-config file
config.load {“path”: “/tmp/pipeline/configs.json”} # absolute path to a merge_and_save_configs output
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Filesystem path to a merged-config JSON file produced by merge_and_save_configs. |
config.merge_save¶
MCP wire name: config__merge_save
Reports that merging and saving configs is NOT available over the JSON tool boundary because merge_and_save_configs needs live in-process Pydantic config objects. Returns an explanatory error pointing at the in-process engine API.
When: Call this only to confirm that saving merged configs is unsupported over the JSON boundary; it always returns an explanatory error pointing at the in-process API.
Examples:
config.merge_save {} # returns the ‘unsupported’ error explaining the in-process path
config.merge_save {“output_file”: “config/config.json”} # output_file is informational only; still returns unsupported
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Intended output path (informational only; the operation is not supported here). |
config.requirements¶
MCP wire name: config__requirements
Given a pipeline DAG, return the configuration field requirements for it: base pipeline config fields, base processing config fields (if any step needs them), and per-step (non-inherited) fields, plus the node->config-class map and which steps still need user input. Primary planning tool for building configs.
When: Call this when you have a pipeline DAG and need to know which config fields (base, processing, per-step) must be filled in before compiling.
Examples:
config.requirements {“dag”: {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]}} # fields a 2-step DAG needs
config.requirements {“dag”: {“dag”: {“nodes”: [“TabularPreprocessing”], “edges”: []}}} # wrapped serializer form, single node
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
yes |
Pipeline DAG topology. Either a flat object with ‘nodes’ and ‘edges’, or the serializer form {‘dag’: {‘nodes’: […], ‘edges’: […]}}. |
dag¶
Construct, validate, and serialize pipeline DAGs (api.dag).
dag.construct¶
MCP wire name: dag__construct
Build a pipeline DAG from nodes and [src, dst] edges and return its serialized JSON (nodes, edges, statistics). Use this to create a round-trippable DAG the other dag.* tools accept.
When: Call this when you have a set of step names and their dependency edges and need a serialized, round-trippable DAG the other dag.* tools accept.
Examples:
dag.construct {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]} # minimal two-step DAG
dag.construct {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”, “XGBoostModelEval”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”], [“XGBoostTraining”, “XGBoostModelEval”]], “metadata”: {“pipeline”: “xgboost-training”, “author”: “me”}} # with embedded metadata
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
yes |
Step names (nodes) of the pipeline DAG, e.g. [‘preprocess’, ‘train’]. |
|
array |
no |
Directed dependency edges as [src, dst] pairs; src runs before dst. Endpoints not listed in ‘nodes’ are added automatically. |
|
object |
no |
Optional free-form metadata embedded in the serialized DAG. |
dag.dependencies¶
MCP wire name: dag__dependencies
For a single step in the DAG, return its immediate upstream dependencies (steps that must run before) and downstream dependents (steps that run after).
When: Call this when you need the immediate upstream (must-run-before) and downstream (run-after) neighbors of one specific step in the DAG.
Examples:
dag.dependencies {“step”: “XGBoostTraining”, “nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]} # dependencies=[TabularPreprocessing]
dag.dependencies {“step”: “XGBoostTraining”, “nodes”: [“TabularPreprocessing”, “XGBoostTraining”, “XGBoostModelEval”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”], [“XGBoostTraining”, “XGBoostModelEval”]]} # also dependents=[XGBoostModelEval]
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Step name to inspect; must be a node in the DAG. |
|
array |
yes |
Step names (nodes) of the pipeline DAG, e.g. [‘preprocess’, ‘train’]. |
|
array |
no |
Directed dependency edges as [src, dst] pairs; src runs before dst. Endpoints not listed in ‘nodes’ are added automatically. |
dag.deserialize¶
MCP wire name: dag__deserialize
Load a DAG from a JSON file written by dag.serialize and return its nodes, edges, statistics, and metadata.
When: Call this to load a DAG back from a JSON file previously written by dag.serialize, recovering its nodes, edges, statistics, and metadata.
Examples:
dag.deserialize {“path”: “/tmp/xgb_dag.json”} # read a DAG file written by dag.serialize
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Path to a DAG JSON file to read. |
dag.help¶
MCP wire name: dag__help
Overview of the ‘dag’ tools — Construct, validate, and serialize pipeline DAGs (api.dag). Returns each dag.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using dag tools.
When: You are about to work with dag tools and want that namespace’s overview + examples.
Examples:
dag.help {} # every dag.* tool with when + examples
dag.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
dag.resolve_plan¶
MCP wire name: dag__resolve_plan
Compute a topologically sorted execution plan for a DAG: the execution order plus per-step dependencies and data-flow map. Fails if the DAG has a cycle.
When: Call this when you need the topological execution order of a validated DAG plus each step’s dependencies and data-flow map before running it.
Examples:
dag.resolve_plan {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]} # execution_order = preprocess then train
dag.resolve_plan {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”, “XGBoostModelEval”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”], [“XGBoostTraining”, “XGBoostModelEval”]]} # three-step ordered plan
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
yes |
Step names (nodes) of the pipeline DAG, e.g. [‘preprocess’, ‘train’]. |
|
array |
no |
Directed dependency edges as [src, dst] pairs; src runs before dst. Endpoints not listed in ‘nodes’ are added automatically. |
dag.serialize¶
MCP wire name: dag__serialize
Serialize a DAG to JSON. If ‘path’ is given, write the JSON file and return the path; otherwise return the JSON string. Validates the DAG before writing to a file.
When: Call this to persist a DAG to a JSON file (pass ‘path’) or to get its JSON string inline (omit ‘path’); it validates the DAG before writing a file.
Examples:
dag.serialize {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]} # returns pretty JSON inline
dag.serialize {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]], “path”: “/tmp/xgb_dag.json”, “pretty”: true} # writes file, returns the path
(writes · tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
yes |
Step names (nodes) of the pipeline DAG, e.g. [‘preprocess’, ‘train’]. |
|
array |
no |
Directed dependency edges as [src, dst] pairs; src runs before dst. Endpoints not listed in ‘nodes’ are added automatically. |
|
object |
no |
Optional free-form metadata embedded in the serialized DAG. |
|
string |
no |
Optional output file path. If omitted, the JSON is returned inline. |
|
boolean |
no |
Pretty-print the JSON with indentation (default true). |
dag.validate_integrity¶
MCP wire name: dag__validate_integrity
Validate a DAG’s integrity (cycles, dangling edges, isolated nodes, undeclared_edge_nodes — edge endpoints not in nodes, i.e. a likely edge-name typo that would become a phantom unconfigured node — and, when the step catalog is available, missing steps/components). Returns {is_valid, issues}. Call before compiling a DAG into a pipeline.
When: Call this before compiling a DAG into a pipeline to check for cycles, dangling edges, isolated nodes, and edge endpoints not declared in nodes.
Examples:
dag.validate_integrity {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]} # expect is_valid true
dag.validate_integrity {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTrainng”]]} # typo endpoint surfaces as undeclared_edge_nodes
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
yes |
Step names (nodes) of the pipeline DAG, e.g. [‘preprocess’, ‘train’]. |
|
array |
no |
Directed dependency edges as [src, dst] pairs; src runs before dst. Endpoints not listed in ‘nodes’ are added automatically. |
execdoc¶
MODS execution-document generation and validation (mods.exe_doc).
execdoc.generate¶
MCP wire name: execdoc__generate
Fill a MODS execution document from a pipeline DAG and a config file. Provide the DAG via ‘dag_file’ (serialized JSON path) or inline ‘dag’ (nodes+edges), plus ‘config_path’. Returns the filled execution document. Call when you need a runnable execution doc for a compiled pipeline.
When: Call when you have a compiled pipeline (DAG + config file) and need to produce a runnable MODS execution document to fill its PIPELINE_STEP_CONFIGS.
Examples:
execdoc.generate {“config_path”: “config.json”, “dag_file”: “pipeline_dag.json”} # fill from a serialized DAG
execdoc.generate {“config_path”: “config.json”, “dag”: {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]]}} # inline DAG
execdoc.generate {“config_path”: “config.json”, “dag_file”: “pipeline_dag.json”, “role”: “arn:aws:iam::123456789012:role/SageMakerRole”} # supply IAM role for full step configs
(network · tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Path to the pipeline configuration JSON file to load configs from. |
|
string |
no |
Path to a serialized DAG JSON file (used if ‘dag’ is not given). |
|
object |
no |
Inline DAG: {‘nodes’: [step names], ‘edges’: [[src, dst], …]}. Used if ‘dag_file’ is not given. |
|
object |
no |
Optional base execution document to fill. If omitted, a template is auto-generated from the DAG node names. |
|
string |
no |
Optional IAM role ARN for AWS operations. Without it (and a SageMaker session), some helpers may produce limited step configs. |
|
string |
no |
Optional project folder used to anchor step source_dir resolution (the caller hook, Strategy 0). When omitted, inferred from ‘config_path’. |
|
string |
no |
Optional file inside the project folder (e.g. the template module); its parent directory is used as the project root. Alternative to ‘project_root’. |
execdoc.help¶
MCP wire name: execdoc__help
Overview of the ‘execdoc’ tools — MODS execution-document generation and validation (mods.exe_doc). Returns each execdoc.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using execdoc tools.
When: You are about to work with execdoc tools and want that namespace’s overview + examples.
Examples:
execdoc.help {} # every execdoc.* tool with when + examples
execdoc.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
execdoc.merge¶
MCP wire name: execdoc__merge
Merge two execution documents, with ‘additional_doc’ taking precedence over ‘base_doc’ (STEP_CONFIG dicts are merged per step). Returns the merged document. Call to combine a base template with generated/overriding step configs.
When: Call to combine a base execution document with generated or overriding step configs, letting ‘additional_doc’ win on conflicts.
Examples:
execdoc.merge {“base_doc”: {“PIPELINE_STEP_CONFIGS”: {“XGBoostTraining”: {“STEP_TYPE”: “TrainingStep”, “STEP_CONFIG”: {}}}}, “additional_doc”: {“PIPELINE_STEP_CONFIGS”: {“XGBoostTraining”: {“STEP_TYPE”: “TrainingStep”, “STEP_CONFIG”: {“InstanceType”: “ml.m5.xlarge”}}}}} # additional_doc overrides STEP_CONFIG
execdoc.merge {“base_doc”: {“PIPELINE_STEP_CONFIGS”: {“TabularPreprocessing”: {“STEP_TYPE”: “ProcessingStep”, “STEP_CONFIG”: {}}}}, “additional_doc”: {“PIPELINE_STEP_CONFIGS”: {“XGBoostTraining”: {“STEP_TYPE”: “TrainingStep”, “STEP_CONFIG”: {}}}}} # add a new step
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
yes |
The base execution document. |
|
object |
yes |
The execution document whose values take precedence on merge. |
execdoc.template¶
MCP wire name: execdoc__template
Create an empty MODS execution-document template for a list of step names. Each step gets a default STEP_TYPE and empty STEP_CONFIG. Call to scaffold a document before filling or merging.
When: Call to scaffold an empty execution document from a list of step names before filling or merging it.
Examples:
execdoc.template {“step_names”: [“TabularPreprocessing”, “XGBoostTraining”]} # scaffold two step configs
execdoc.template {“step_names”: [“XGBoostTraining”]} # single-step template
(tags: programmer)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
yes |
Step names to include as PIPELINE_STEP_CONFIGS entries. |
execdoc.validate¶
MCP wire name: execdoc__validate
Validate the structure of an execution document. Returns {valid, issues}. Call to check a document has a well-formed PIPELINE_STEP_CONFIGS before generating or merging.
When: Call to check that an execution document is well-formed (has a valid PIPELINE_STEP_CONFIGS mapping) before generating or merging.
Examples:
execdoc.validate {“execution_document”: {“PIPELINE_STEP_CONFIGS”: {“XGBoostTraining”: {“STEP_TYPE”: “TrainingStep”, “STEP_CONFIG”: {}}}}} # valid document
execdoc.validate {“execution_document”: {“PIPELINE_STEP_CONFIGS”: {}}} # empty-but-valid mapping
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
object |
yes |
The execution document to validate. |
pipeline_catalog¶
Recommend/select/load pre-built shared DAGs (pipeline_catalog).
pipeline_catalog.auto_select¶
MCP wire name: pipeline_catalog__auto_select
Auto-select the single best-matching shared DAG for a framework/features/task-type, or return null if no DAG meets the score threshold. Call when you want one decisive pick rather than a ranked list.
When: Call when you want one decisive best-match DAG (or null) instead of a ranked list — e.g. to auto-pick a pipeline for a known framework/task.
Examples:
pipeline_catalog.auto_select {“framework”: “xgboost”} # single best XGBoost DAG at default 0.6 threshold
pipeline_catalog.auto_select {“framework”: “pytorch”, “features”: [“training”, “bedrock_realtime_processing”, “edx_uploading”], “task_type”: “incremental”} # target the incremental EDX DAG
pipeline_catalog.auto_select {“framework”: “lightgbm”, “min_score”: 0.8} # stricter threshold
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Required framework; omit to not filter. |
|
array |
no |
Required features (e.g. [‘training’,’bedrock’,’edx_uploading’]). |
|
string |
no |
Task-type keyword (e.g. ‘incremental’, ‘end_to_end’). |
|
number |
no |
Minimum match score in 0-1 to accept a pick (default 0.6). |
pipeline_catalog.config_guidance¶
MCP wire name: pipeline_catalog__config_guidance
Get configuration guidance for one shared DAG — prerequisites, required vs default config values, common pitfalls, and a decision tree. Call before building a config for a chosen DAG.
When: Call before authoring a config for a chosen DAG to learn its prerequisites, required vs default config fields, and common pitfalls.
Examples:
pipeline_catalog.config_guidance {“dag_id”: “bedrock_pytorch_incremental_edx”} # config prerequisites for the incremental EDX DAG
pipeline_catalog.config_guidance {“dag_id”: “lightgbmmt_complete_e2e”} # config guidance for a multi-task LightGBM DAG
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
DAG identifier to fetch configuration guidance for. |
pipeline_catalog.get_dag¶
MCP wire name: pipeline_catalog__get_dag
Get full details of one shared DAG — nodes, edges, input requirements, constraints, cost, and agent context. Call after choosing a dag_id from recommend/list to inspect its structure.
When: Call after picking a dag_id from recommend/list to inspect that DAG’s nodes, edges, input requirements, and constraints.
Examples:
pipeline_catalog.get_dag {“dag_id”: “bedrock_pytorch_incremental_edx”} # inspect an incremental LLM-scoring DAG
pipeline_catalog.get_dag {“dag_id”: “lightgbm_complete_e2e”} # inspect an end-to-end LightGBM DAG
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
DAG identifier (e.g. ‘bedrock_pytorch_incremental_edx’). |
pipeline_catalog.help¶
MCP wire name: pipeline_catalog__help
Overview of the ‘pipeline_catalog’ tools — Recommend/select/load pre-built shared DAGs (pipeline_catalog). Returns each pipeline_catalog.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using pipeline_catalog tools.
When: You are about to work with pipeline_catalog tools and want that namespace’s overview + examples.
Examples:
pipeline_catalog.help {} # every pipeline_catalog.* tool with when + examples
pipeline_catalog.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
pipeline_catalog.list¶
MCP wire name: pipeline_catalog__list
List every available shared DAG id with its metadata (framework, description, task type, complexity, features). Call to browse the catalog.
When: Call to browse the whole catalog when you don’t yet know which dag_id exists — returns every shared DAG id with its metadata.
Examples:
pipeline_catalog.list {} # list every available shared DAG with metadata
(tags: planner)
pipeline_catalog.load_dag¶
MCP wire name: pipeline_catalog__load_dag
Load a shared DAG by id and return its nodes and edges in JSON-safe form. Call to retrieve the concrete graph structure for compilation or display.
When: Call to retrieve the concrete node/edge graph of a chosen DAG for compilation or display (lighter than get_dag, no requirements/constraints).
Examples:
pipeline_catalog.load_dag {“dag_id”: “bedrock_pytorch_incremental_edx”} # load nodes+edges for compilation
pipeline_catalog.load_dag {“dag_id”: “lightgbm_complete_e2e”} # load the end-to-end LightGBM graph
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
DAG identifier to load from the shared catalog. |
pipeline_catalog.recommend¶
MCP wire name: pipeline_catalog__recommend
Recommend pre-built shared DAGs ranked by how well they match semantic requirements (data type, labels, LLM need, framework, GPU). Call when the user describes an ML problem and you need candidate pipeline DAGs.
When: Call when the user describes an ML problem and you need a ranked list of candidate shared-DAG pipelines to choose from.
Examples:
pipeline_catalog.recommend {} # rank all DAGs against defaults (labeled tabular, GPU on)
pipeline_catalog.recommend {“data_type”: “tabular”, “framework”: “xgboost”} # tabular XGBoost candidates
pipeline_catalog.recommend {“data_type”: “text”, “needs_llm”: true, “framework”: “pytorch”} # LLM-enriched PyTorch text pipelines
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Primary data type to train on. |
|
boolean |
no |
Whether labeled training data already exists (default true). |
|
boolean |
no |
Whether an LLM (Bedrock) is needed for labeling/enrichment (default false). |
|
boolean |
no |
Whether multiple output tasks are required (default false). |
|
boolean |
no |
Whether this is incremental retraining rather than first-time (default false). |
|
string |
no |
Preferred ML framework; ‘any’ or omit to not filter. |
|
boolean |
no |
Whether GPU instances are available (default true). |
project¶
Scaffold a new Cursus pipeline project (phase-0 skeleton + action-item ledger).
project.bring_up¶
MCP wire name: project__bring_up
Return the invocation for the cursus-new-project auto-chain orchestrator, which composes scaffold -> DAG (catalog-seeded or human-authored) -> config generation end-to-end. Bring-up is a multi-phase workflow, not a single stateless call, so this validates the inputs and hands back the exact workflow + args to run.
When: Call when you want the whole project brought up end-to-end (skeleton + DAG + config), not just the phase-0 skeleton — it returns the orchestrator workflow to run.
Examples:
project.bring_up {“name”: “secure_delivery”, “framework”: “xgboost”} # catalog DAG, full chain
project.bring_up {“name”: “new_model”, “framework”: “pytorch”, “dag_source”: “manual”} # scaffold, then human authors the DAG
project.bring_up {“name”: “eu_risk”, “framework”: “bedrock”, “region”: “EU”} # EU config target
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Project base name (snake_case). |
|
string |
yes |
Model framework. |
|
string |
no |
Where the project folder is created (default ‘projects’). |
|
string |
no |
Region alias for the generated config (default ‘NA’). |
|
string |
no |
‘catalog’ seeds a shared DAG and chains fully; ‘manual’ stops after scaffold for a human to author the DAG. |
project.help¶
MCP wire name: project__help
Overview of the ‘project’ tools — Scaffold a new Cursus pipeline project (phase-0 skeleton + action-item ledger). Returns each project.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using project tools.
When: You are about to work with project tools and want that namespace’s overview + examples.
Examples:
project.help {} # every project.* tool with when + examples
project.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
project.init¶
MCP wire name: project__init
Scaffold a NEW Cursus pipeline project (phase-0). Writes the fixed skeleton — a region-agnostic run_pipeline.py, the @MODSTemplate deployment class (loads pipeline_config/dag.json), a shared generate_config.py skeleton with project_root_folder filled + a TODO per-node value-init, an empty dag.json stub, the folder tree + per-folder READMEs — and a root README action-item ledger handing every context-dependent piece (author the DAG, copy scripts/handlers, fill config) to its owning downstream workflow. Deterministic and offline; generates only what is knowable before a DAG exists.
When: Call at the very start of a new pipeline project, before any DAG or config exists, to lay down the standard package skeleton + the checklist of what to do next.
Examples:
project.init {“name”: “secure_delivery”, “framework”: “xgboost”} # -> projects/secure_delivery_xgboost/
project.init {“name”: “abuse_polygraph”, “framework”: “pytorch”, “target_dir”: “src/buyer_abuse_mods_template”} # BAMT deploy target (sets import prefix)
project.init {“name”: “fraud_scan”, “framework”: “lightgbmmt”, “overwrite”: true} # write into an existing folder
(destructive · writes · tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Project base name (snake_case), e.g. ‘secure_delivery’. The framework is appended as a suffix. |
|
string |
yes |
Model framework; becomes the project-name suffix and selects the handler/hyperparameter template. |
|
string |
no |
Directory to create |
|
boolean |
no |
Write into an existing target directory instead of failing. Default false. |
steps¶
Per-step connection/I-O view: container paths, property refs, channels.
steps.help¶
MCP wire name: steps__help
Overview of the ‘steps’ tools — Per-step connection/I-O view: container paths, property refs, channels. Returns each steps.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using steps tools.
When: You are about to work with steps tools and want that namespace’s overview + examples.
Examples:
steps.help {} # every steps.* tool with when + examples
steps.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
steps.io¶
MCP wire name: steps__io
Return a step’s connection / I-O view: for each dependency the container path, required flag, type, compatible_sources, and the SageMaker training channel(s) it fans into (e.g. input_path -> train/val/test); for each output the container path and the runtime property_path reference a downstream step resolves against. This is the path/wiring view the Facade hides from a readable builder class — the complement to catalog.step_spec. Use to wire a step or understand where its data lands.
When: Call this when wiring a step or figuring out where its data lands — you need each dependency’s container path + training channel fan-out and each output’s container path + runtime property_path.
Examples:
steps.io {“step_name”: “XGBoostTraining”} # container paths + channel fan-out + property_paths
steps.io {“step_name”: “BatchTransform”} # I/O wiring for the batch transform step
steps.io {“step_name”: “TabularPreprocessing”, “job_type”: “training”} # resolve the training variant
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name, e.g. ‘XGBoostTraining’, ‘BatchTransform’. |
|
string |
no |
Optional job_type variant (training | validation | testing | calibration | …) — resolves the variant’s spec. |
steps.patterns¶
MCP wire name: steps__patterns
Return a step’s construction PATTERNS — the ‘plugins’ the TemplateStepBuilder composes for each axis: the bound create_step handler (from sagemaker_step_type + step_assembly), and the env-var / job-argument / input / output / compute patterns (all derived from the step’s .step.yaml contract DATA + registry binding, so the view cannot drift from behavior). Each axis carries ‘custom_override’: true where the builder still hand-overrides that method (a genuine per-step deviation). A top-level ‘dependencies’ rollup reports the step’s 3rd-party footprint (build_time {axis: pkg} for mods_workflow_core / SAIS-SDK vs runtime script deps vs native sagemaker-only). Use to see how a step is assembled — and what it costs to import — without reading a builder class.
When: Call this when you want to see how a step is assembled (its per-axis create_step / env-var / job-arg / input / output / compute patterns and its 3rd-party import footprint) without reading a builder class.
Examples:
steps.patterns {“step_name”: “XGBoostTraining”} # assembly axes for the XGBoost training step
steps.patterns {“step_name”: “TabularPreprocessing”, “job_type”: “calibration”} # resolve the calibration variant
steps.patterns {“step_name”: “ModelCalibration”, “job_type”: “training”} # patterns for a specific job_type variant
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name, e.g. ‘XGBoostTraining’, ‘TabularPreprocessing’. |
|
string |
no |
Optional job_type variant (training | validation | testing | calibration | …) — resolves the variant’s spec. |
strategies¶
Inspect the builder strategy library — axes and knobs (registry.strategy_registry).
strategies.for_step_type¶
MCP wire name: strategies__for_step_type
Given a sagemaker_step_type (and, for Processing, a step_assembly: code | step_args | delegation), return the strategy the builder facade would bind — handler, verb, preset knobs, and available knobs. This is the replacement for ‘read the builder class’: it tells an agent which strategy + knobs compose a step of this type.
When: Call this when authoring a step and you need the strategy + knobs the facade would bind for a given sagemaker_step_type — the replacement for reading the builder class.
Examples:
strategies.for_step_type {“sagemaker_step_type”: “Training”} # strategy the facade binds for a Training step
strategies.for_step_type {“sagemaker_step_type”: “Processing”, “step_assembly”: “code”} # Processing via the “code” assembly (script-driven)
strategies.for_step_type {“sagemaker_step_type”: “Processing”, “step_assembly”: “step_args”} # Processing via the “step_args” assembly
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
The step’s SageMaker step type, e.g. ‘Training’, ‘Processing’. |
|
string |
no |
Processing sub-discriminator (code | step_args | delegation); ignored for non-Processing types. Defaults to ‘code’. |
strategies.help¶
MCP wire name: strategies__help
Overview of the ‘strategies’ tools — Inspect the builder strategy library — axes and knobs (registry.strategy_registry). Returns each strategies.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using strategies tools.
When: You are about to work with strategies tools and want that namespace’s overview + examples.
Examples:
strategies.help {} # every strategies.* tool with when + examples
strategies.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
strategies.knobs¶
MCP wire name: strategies__knobs
List just the declarative knobs a strategy accepts, identified by (axis, name). Use to learn which knobs a step’s .step.yaml registry block can set.
When: Call this when you already know the (axis, name) of a strategy and just want the declarative knobs its .step.yaml registry block can set.
Examples:
strategies.knobs {“axis”: “sagemaker_step_type”, “name”: “Training”} # knobs the Training strategy accepts
strategies.knobs {“axis”: “step_assembly”, “name”: “code”} # knobs for the Processing “code” assembly strategy
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Routing axis of the strategy. |
|
string |
yes |
Strategy name on that axis. |
strategies.list¶
MCP wire name: strategies__list
List the registered builder strategies (construction-verb handlers + their knobs), optionally filtered to one routing axis. Each entry is a full strategy descriptor.
When: Call this when you want to enumerate the registered strategies (all axes, or one axis) with their full descriptors.
Examples:
strategies.list {} # every registered strategy across all axes
strategies.list {“axis”: “sagemaker_step_type”} # only the step-type strategies (Training, Transform, …)
strategies.list {“axis”: “step_assembly”} # only the Processing assembly strategies (code, step_args, delegation)
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Filter to one axis (e.g. ‘sagemaker_step_type’, ‘step_assembly’). |
strategies.list_axes¶
MCP wire name: strategies__list_axes
List the builder strategy library’s routing axes (sagemaker_step_type, step_assembly) and how many strategies each carries. Start here to understand the strategy space.
When: Call this first when you want an overview of the strategy space — which routing axes exist and how many strategies each carries.
Examples:
strategies.list_axes {} # the routing axes + strategy counts
(tags: planner)
strategies.show¶
MCP wire name: strategies__show
Return one strategy’s full descriptor: verb, handler class, every knob (name/type/default/required/doc), and preset knobs. Pass ‘axis’ to disambiguate a name that exists on more than one axis.
When: Call this when you know a strategy name and want its full descriptor — verb, handler class, and every knob (name/type/default/required/doc).
Examples:
strategies.show {“name”: “Training”} # full descriptor for the Training strategy
strategies.show {“name”: “code”, “axis”: “step_assembly”} # disambiguate the Processing “code” assembly strategy by axis
strategies.show {“name”: “Transform”} # the batch-Transform strategy descriptor
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Strategy name, e.g. ‘Training’, ‘code’. |
|
string |
no |
Disambiguating axis (optional). |
tools¶
Meta/discovery over the tool registry itself (help, by_phase, describe_tool).
tools.by_phase¶
MCP wire name: tools__by_phase
List the cursus MCP tools tagged for a lifecycle phase — ‘planner’ (discover/select/assemble), ‘validator’ (check before building), or ‘programmer’ (compile/generate). Use this to pick the right tool for the step you are on instead of scanning every tool.
When: You know the lifecycle phase you are on and want its tools without the full overview.
Examples:
tools.by_phase {“phase”: “planner”} # discover/select/assemble tools
tools.by_phase {“phase”: “validator”} # pre-build checks
tools.by_phase {“phase”: “programmer”} # compile/generate tools
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Lifecycle phase to filter by. |
tools.describe_tool¶
MCP wire name: tools__describe_tool
Return the full descriptor for one cursus MCP tool by name: its description, when-to-use cue, usage examples, JSON input schema, phase tags, and whether it is destructive. Use to learn exactly how to call a tool you found via tools.help, a
When: You have a specific tool name and need its exact arguments before calling it.
Examples:
tools.describe_tool {“name”: “compile.dag”} # schema + examples for compile.dag
tools.describe_tool {“name”: “catalog.list_steps”}
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Dotted tool name, e.g. ‘compile.dag’. |
tools.help¶
MCP wire name: tools__help
START HERE. Introduce the entire cursus toolset in one call: a short overview, the lifecycle phases (planner/validator/programmer), and every tool grouped by namespace with its one-line description. Optional ‘namespace’ or ‘phase’ filters narrow the listing; set ‘include_schema’ to also get each tool’s JSON input schema. Use this to orient before picking a tool, then tools.describe_tool for exact args.
When: At the start of any task, or whenever you are unsure which cursus tool to use.
Examples:
tools.help {} # full overview of every namespace and tool
tools.help {“namespace”: “compile”} # just the compile.* tools
tools.help {“phase”: “validator”} # every validator-phase tool
tools.help {“namespace”: “dag”, “include_schema”: true} # dag tools + input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one namespace (e.g. ‘catalog’, ‘compile’). Omit to list all namespaces. |
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
validate¶
Alignment, dependency, and script-execution checks (validation, core.deps).
validate.alignment¶
MCP wire name: validate__alignment
Run configuration-driven alignment validation across all levels and return summary metrics (pass/fail/excluded counts, pass rate, step-type breakdown) plus critical issues. Pass ‘target_scripts’ to validate only specific steps.
When: Call this before compiling to prove steps are constructible — run all levels and get pass/fail counts and critical issues, optionally scoped to a subset.
Examples:
validate.alignment {} # validate every discovered step
validate.alignment {“target_scripts”: [“TabularPreprocessing”, “XGBoostTraining”]} # only these two steps
validate.alignment {“target_scripts”: [“XGBoostTraining”], “workspace_dirs”: [“/path/to/project”]} # widen discovery to a project dir
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
no |
Optional subset of step names to validate; omit to validate all discovered steps. |
|
array |
no |
Optional workspace directories to widen step discovery beyond the installed package. |
validate.builder¶
MCP wire name: validate__builder
Run the universal builder test suite for one step’s builder — builder↔config alignment, integration, step-creation, and (by default) quality scoring — and return the structured result. Use to validate a builder before registration.
When: Call this to test one step’s builder (builder<->config alignment, integration, step-creation, quality score) before registering or trusting that builder.
Examples:
validate.builder {“step_name”: “XGBoostTraining”} # full builder suite with scoring
validate.builder {“step_name”: “TabularPreprocessing”, “enable_scoring”: false} # skip the quality score
validate.builder {“step_name”: “XGBoostTraining”, “workspace_dirs”: [“/path/to/project”]} # widen discovery to a project dir
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name whose builder to test (e.g. ‘XGBoostTraining’). |
|
boolean |
no |
Include quality scoring in the result (default true). |
|
array |
no |
Optional workspace directories to widen step discovery beyond the installed package. |
validate.deps_explain¶
MCP wire name: validate__deps_explain
Explain the semantic similarity between two names: overall score plus the per-component breakdown (string / token / synonym / substring) the dependency resolver uses. Use to debug why two step or port names did or did not match.
When: Call this to debug a dependency match: get the overall + per-component semantic similarity score for two names when a deps_resolve match looks wrong or missing.
Examples:
validate.deps_explain {“name1”: “processed_data”, “name2”: “input_data”} # why two port names did/did not match
validate.deps_explain {“name1”: “TabularPreprocessing”, “name2”: “XGBoostTraining”} # compare two step names
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
First name to compare. |
|
string |
yes |
Second name to compare. |
validate.deps_resolve¶
MCP wire name: validate__deps_resolve
Resolve declarative dependencies among a set of steps using their catalog specifications: reports which required/optional dependencies match compatible outputs of the other steps, plus an overall resolution rate. Omit ‘step_names’ to use every catalog step that has a specification.
When: Call this to check whether a set of steps wires up — which required/optional dependencies match compatible outputs of the others — before assembling a DAG.
Examples:
validate.deps_resolve {} # resolve across every catalog step with a spec
validate.deps_resolve {“step_names”: [“TabularPreprocessing”, “XGBoostTraining”, “XGBoostModelEval”]} # just this pipeline
validate.deps_resolve {“step_names”: [“XGBoostTraining”], “workspace_dirs”: [“/path/to/project”]} # widen discovery to a project dir
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
no |
Steps to include in the resolution graph; omit to use all steps with specifications. |
|
array |
no |
Optional workspace directories to widen step discovery beyond the installed package. |
validate.help¶
MCP wire name: validate__help
Overview of the ‘validate’ tools — Alignment, dependency, and script-execution checks (validation, core.deps). Returns each validate.* tool with its description, when to use it, and usage examples. Set include_schema for full JSON input schemas. Start here before using validate tools.
When: You are about to work with validate tools and want that namespace’s overview + examples.
Examples:
validate.help {} # every validate.* tool with when + examples
validate.help {“include_schema”: true} # same, plus JSON input schemas
(tags: planner)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Restrict to one lifecycle phase. |
|
boolean |
no |
Attach each tool’s JSON input schema (default false). |
validate.info¶
MCP wire name: validate__info
Return capability metadata for the validation and script-testing frameworks (available components, supported user stories, key features).
When: Call this to discover what the validation and script-testing frameworks can do (available components, supported user stories, key features) before using them.
Examples:
validate.info {} # capability metadata for the validation frameworks
(tags: validator)
validate.run_scripts¶
MCP wire name: validate__run_scripts
Execute a DAG’s step scripts locally against a pipeline config file and return per-script success/error and execution order. Heavy and SIDE-EFFECTING: it imports and RUNS each step script as local code and may pip-install their imports, so it can read/write local files and reach the network. On a public MCP server it is disabled unless CURSUS_MCP_ALLOW_SCRIPT_EXEC=1.
When: Call this to actually run a DAG’s step scripts locally against a config file (a heavier end-to-end check) once the DAG and configs are ready.
Examples:
validate.run_scripts {“nodes”: [“TabularPreprocessing”], “config_path”: “pipeline_config/config.json”} # run one script
validate.run_scripts {“nodes”: [“TabularPreprocessing”, “XGBoostTraining”], “edges”: [[“TabularPreprocessing”, “XGBoostTraining”]], “config_path”: “pipeline_config/config.json”} # run a two-step chain
validate.run_scripts {“nodes”: [“XGBoostTraining”], “config_path”: “pipeline_config/config.json”, “use_dependency_resolution”: false} # skip two-phase dependency resolution
(exec_code · network · tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
array |
yes |
Step names that make up the DAG (at least one). |
|
string |
yes |
Path to the pipeline configuration JSON used to resolve and validate each step’s script. |
|
array |
no |
Optional directed edges as [from_step, to_step] pairs. |
|
string |
no |
Directory for the test workspace (default ‘test/integration/script_testing’). |
|
boolean |
no |
Whether to use two-phase dependency resolution (default true). |
validate.step¶
MCP wire name: validate__step
Run alignment validation for a single named step and return its per-level result (status + any errors per validation level).
When: Call this to drill into one step’s per-level result after a full validate.alignment run flagged it, or when iterating on a single step.
Examples:
validate.step {“step_name”: “TabularPreprocessing”} # per-level result for one step
validate.step {“step_name”: “XGBoostTraining”, “workspace_dirs”: [“/path/to/project”]} # widen discovery to a project dir
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
yes |
Canonical step name to validate (e.g. ‘TabularPreprocessing’). |
|
array |
no |
Optional workspace directories to widen step discovery beyond the installed package. |
validate.step_interface¶
MCP wire name: validate__step_interface
Validate a step’s .step.yaml interface at AUTHOR time — the agent-callable form of cursus validate step-interface. Loads the interface through the production StepInterface.from_yaml path (Pydantic field errors + contract<->spec alignment) and flags compatible_sources case-typos. Pass ‘step_name’ (optionally ‘job_type’) for one step, or ‘all’=true to validate every interface (the CI gate). This is the author-time gate before author.preflight_step / validate.alignment.
When: Call this at AUTHOR time right after writing/editing a .step.yaml — the first gate before author.preflight_step and validate.alignment; or ‘all’=true in CI.
Examples:
validate.step_interface {“step_name”: “XGBoostTraining”} # validate one step interface
validate.step_interface {“step_name”: “TabularPreprocessing”, “job_type”: “calibration”} # a specific job_type variant
validate.step_interface {“all”: true} # CI mode: validate every .step.yaml
(tags: validator)
Parameters
name |
type |
required |
description |
|---|---|---|---|
|
string |
no |
Canonical step name to validate (e.g. ‘XGBoostTraining’). Omit when ‘all’ is true. |
|
boolean |
no |
Validate every .step.yaml interface (CI mode). When true, ‘step_name’ is ignored. |
|
string |
no |
Optional job_type variant to resolve (e.g. ‘validation’, ‘calibration’). |