Define assets using the @asset decorator; annotate return values with Output(value, metadata={...}) to attach structured metadata (row counts, data previews, URLs) that appears in the Dagster UI and is queryable via API
Group related assets in an AssetSelection and wire them into a job with define_asset_job; expose the job through a Definitions object so Dagster registers it
Launch a materialization via the GraphQL mutation launchPipelineExecution (for jobs) or launchAssetMaterialization (for ad-hoc asset runs), passing the asset keys you want to materialize
Poll assetMaterializations(assetKey: {path: [...]}, limit: 1) in the GraphQL API to fetch the latest materialization event; the response includes timestamp, runId, and the metadata entries you attached
For downstream automation, attach an AutomationCondition such as AutomationCondition.eager() to assets that should auto-materialize when upstream assets are updated; the default_automation_condition_sensor evaluates conditions every 30 seconds
Known gotchas
Asset keys are tuples of strings forming a path; a mismatch between the key used in @asset and the key used in a GraphQL query will return empty results with no error
Materialization metadata values must be wrapped in Dagster metadata types (MetadataValue.int, MetadataValue.url, etc.); raw Python primitives passed directly in the metadata dict will raise a serialization error at runtime
launchAssetMaterialization is non-blocking; poll assetMaterializations or subscribe to run events to determine completion rather than assuming the launch call implies a finished run
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp