dagster-mcp
A read-only MCP server for monitoring and diagnosing a Dagster instance (17 tools; no write tools are registered in this schema).
Instance health —
get_instance_statusfor daemon heartbeats, queued-run counts and code location errors;list_code_locationsfor load status.Runs —
get_runslists/filters recent runs by job and status;get_run_statusshows config, tags and re-execution lineage;get_run_logsstreams paginated, level-filtered events;get_run_statsgives per-step timing/materializations/expectations;get_run_failure_summaryconsolidates failed steps, root cause and suggestions.Assets —
search_assetsdiscovers by prefix/group;resolve_asset_selectionresolves Dagster selection syntax (wildcards, and/or/not, roots/sinks, upstream/downstream traversal) into concrete keys without launching anything;get_asset_detailsreturns lineage and partitions;get_recent_materializationsandget_asset_healthcover history and staleness/freshness.Jobs —
list_jobsinventories jobs across code locations with optional repository/location filters, raising if a relevant location failed to load.Schedules & sensors —
list_schedulesandlist_sensorsshow status/cron/targets;get_tick_historyexposes tick-by-tick success, skips, failures and launched runs to catch silent failures.Backfills —
list_backfillsreports status and partition progress.Multi-environment — every tool accepts an optional
envargument to target one of several configured Dagster instances.Not available here — launching/materializing/backfilling, terminating runs, starting or stopping schedules/sensors, and reloading code locations; those 10 write tools are only registered when
DAGSTER_READ_ONLY=false.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dagster-mcpcheck instance status and re-run failed jobs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Dagster MCP
An MCP server that gives AI agents full visibility and control over your Dagster instance — like an SRE for your data pipelines.
Works with any MCP client: Claude Code, Claude Desktop, Cursor, and more.
Dagster officially develops and supports their own Dagster Plus MCP server. See the documentation here.
Why this exists
Data pipelines break at 3 AM. Schedules silently stop firing. Assets go stale. Instead of waking up to a dashboard full of red, give your AI agent the tools to monitor, diagnose, and fix your Dagster instance autonomously.
Agent: Checking instance health...
get_instance_status() -> healthy: false, daemon "SCHEDULER" unhealthy
Agent: Scheduler daemon is down. Let me check recent failures...
get_runs(statuses=["FAILURE"], limit=5) -> 3 failed runs in the last hour
Agent: Diagnosing the most recent failure...
get_run_failure_summary("run_abc123") ->
failed_steps: ["transform_orders"]
root_cause: "NullPointerError: column 'price' is null"
suggestions: ["Single step failed — consider re-running from failure"]
Agent: Re-launching the failed job...
launch_job("etl_pipeline", "my_project") -> run_id: "run_def456", status: STARTED
Agent: One sensor keeps firing on bad data. Checking its ticks...
get_tick_history("orders_sensor", "SENSOR") -> 12 consecutive FAILURE ticks
Agent: Stopping it until the upstream fix lands...
stop_sensor("orders_sensor") -> status: STOPPEDRelated MCP server: ensemble-mcp
What it does
27 tools across 6 categories, designed for autonomous DataOps workflows:
Category | Tools | What an agent can do |
Runs |
| Find failures, diagnose root causes, inspect logs and step timing |
Assets |
| Discover assets, preview lineage selections, check freshness, detect stale data |
Jobs |
| Inventory jobs across code locations, with optional repository/location filters |
Schedules & Sensors |
| Detect silent failures, missed ticks, sensor errors |
Instance |
| Global health check, daemon status, code location errors |
Actions |
| Materialize concrete assets with config, backfill partitions, launch jobs, stop stuck runs, start or stop schedules and sensors, reload after deploy |
Actions are opt-in: set
DAGSTER_READ_ONLY=falseto enable write operations.
Quick start
Prerequisites
Install
The package is published on PyPI.
Option A — run directly with uvx (no install needed):
uvx dagster-mcpOption B — install with pip:
pip install dagster-mcpOption C — clone and run:
git clone https://github.com/fabdendev/dagster-mcp.git
cd dagster-mcp
uv syncConfigure
Single environment
Variable | Description | Default |
| Base URL of your Dagster instance |
|
| Dagster Cloud API token (leave empty for self-hosted) | (empty) |
| JSON object of additional request headers sent to Dagster GraphQL | (empty) |
| When |
|
Self-hosted:
export DAGSTER_URL=http://localhost:3000Dagster Cloud:
export DAGSTER_URL=https://myorg.dagster.cloud/prod
export DAGSTER_API_TOKEN=your-dagster-cloud-user-tokenCustom auth / proxy headers:
export DAGSTER_EXTRA_HEADERS='{"Authorization":"Bearer your-token","X-My-Header":"value"}'Multiple environments
Use DAGSTER_ENVS to configure several Dagster instances in one server. Every tool then accepts an optional env parameter so the LLM can target the right instance.
Variable | Description | Default |
| JSON object mapping env names to | (empty) |
| Env name to use when | (empty) |
export DAGSTER_ENVS='{
"prod": {"url": "https://myorg.dagster.cloud/prod", "token": "prod-token"},
"staging": {"url": "https://myorg.dagster.cloud/staging", "token": "stg-token"},
"dev": {"url": "http://localhost:3000"}
}'
export DAGSTER_DEFAULT_ENV=prodWhen DAGSTER_ENVS is set, DAGSTER_URL / DAGSTER_API_TOKEN / DAGSTER_EXTRA_HEADERS are ignored. If only one env is defined, it is used automatically even without DAGSTER_DEFAULT_ENV.
Add to your MCP client
Add to ~/.claude/settings.json:
Single env:
{
"mcpServers": {
"dagster": {
"command": "uvx",
"args": ["dagster-mcp"],
"env": {
"DAGSTER_URL": "http://localhost:3000"
}
}
}
}Multiple envs:
{
"mcpServers": {
"dagster": {
"command": "uvx",
"args": ["dagster-mcp"],
"env": {
"DAGSTER_ENVS": "{\"prod\":{\"url\":\"https://myorg.dagster.cloud/prod\",\"token\":\"prod-token\"},\"dev\":{\"url\":\"http://localhost:3000\"}}",
"DAGSTER_DEFAULT_ENV": "prod"
}
}
}
}Add to claude_desktop_config.json:
{
"mcpServers": {
"dagster": {
"command": "uvx",
"args": ["dagster-mcp"],
"env": {
"DAGSTER_URL": "http://localhost:3000"
}
}
}
}{
"mcpServers": {
"dagster": {
"command": "uv",
"args": ["run", "--directory", "/path/to/dagster-mcp", "dagster-mcp"],
"env": {
"DAGSTER_URL": "http://localhost:3000"
}
}
}
}Tool reference
Runs
Tool | Description |
| List recent runs, filter by job name and/or status |
| Get status, config, tags, and run lineage (re-execution chain via rootRunId/parentRunId) |
| Get structured log events with pagination and optional level filtering ( |
| Get per-step execution stats: timing, materializations, expectation results |
| Consolidated failure diagnosis — failed steps, root cause error, step durations, and suggestions in one call |
Assets
Tool | Description |
| Discover assets by key prefix or group name |
| Resolve key/group/tag/kind/owner predicates, wildcards, boolean logic, roots/sinks, and lineage traversal into concrete asset keys without launching anything |
| Get description, upstream/downstream dependencies, partitions, latest materialization |
| Get materialization history with metadata for an asset |
| Consolidated health view — staleness, freshness policy, last run status (works with single asset or entire group) |
Two-step asset workflow
Start by resolving and reviewing a selection expression:
resolve_asset_selection(
asset_selection="group:analytics and (kind:dbt or key:*benchmark)"
)
→ {
"asset_keys": [
"warehouse/analytics/orders",
"warehouse/analytics/reranker_benchmark"
],
"assets": [...]
}For concrete, unpartitioned assets, pass the returned keys to
materialize_assets with any required launch config and tags:
materialize_assets(
asset_keys=[
"warehouse/analytics/orders",
"warehouse/analytics/reranker_benchmark"
],
run_config={"ops": {"benchmark": {"config": {"limit": 1000}}}},
tags={"triggered_by": "agent"}
)For partitioned assets, pass the same resolved keys to backfill_assets
instead:
backfill_assets(
asset_keys=["warehouse/analytics/daily_orders"],
partition_start="2026-07-01",
partition_end="2026-07-07",
run_config={"resources": {"warehouse": {"config": {"pool": "benchmark"}}}}
)resolve_asset_selection is available in both read-only and read-write modes.
It returns external, observable, non-executable, and partitioned matches so the
caller can inspect the complete result. The write tools re-fetch current asset
definitions before execution. resolve_asset_selection and materialize_assets
require Dagster 1.9+.
Jobs, Schedules & Sensors
Tool | Description |
| List jobs across code locations, optionally filtered by exact |
| List schedules with status (RUNNING/STOPPED), cron, target job, next tick |
| List sensors with status and target jobs |
| Tick-by-tick history for a schedule or sensor — essential for detecting silent failures. Accepts optional |
list_jobs filters are independent and use AND semantics when combined. For
example, list_jobs(repository_name="example_repository") finds that repository
across locations, while
list_jobs(repository_name="example_repository", location_name="example_location")
targets one repository and code-location pair. Calls with only one filter use a
lightweight repository-discovery request followed by one batched job request —
it isn't free: that's a second round-trip against Dagster, traded for a
smaller payload when only a subset of repositories matches. Request counts
per call: 1 for no filters, 1 for both filters, 2 for exactly one filter.
If a code location relevant to the filter failed to load or is still loading,
list_jobs raises a RuntimeError naming the location instead of silently
returning an empty result — an empty filtered result means no match among
code locations Dagster could actually load. A non-empty filtered result can
still be incomplete: if some repositories matched, list_jobs returns them
rather than raising, even when another code location could not be searched.
This check rides along in the same requests above (workspaceOrError, which
list_code_locations already queries), so it adds no extra round-trip. The
unfiltered call
(list_jobs() with no filters) is unchanged: it omits this check and keeps
returning whatever is loaded, since an agent won't misread a long inventory
listing as "nothing exists" the way it would misread an empty filtered
result — use list_code_locations or get_instance_status to check load
health directly.
Instance & Code Locations
Tool | Description |
| Start here — global health: daemon status, queued run count, code location errors |
| List all code locations and their load status |
| List recent backfills with status and partition progress |
Write Operations
Tool | Description |
| Launch concrete, unpartitioned asset keys with run config and tags; infers one compatible repository/job, includes compatible checks, and expands required non-subsettable multi-asset neighbors. On a failed launch it returns the preflight context plus |
| Launch a partition backfill by asset selection with optional run config; respects each asset's |
| Launch a named job; |
| Launch a partitioned job for one or more partition keys; creates a backfill (supports |
| Start (enable) a schedule so it launches runs on its cron |
| Stop (disable) a schedule — persists across restarts; does not terminate in-flight runs |
| Start (enable) a sensor so it resumes evaluating |
| Stop (disable) a sensor — the fix for a runaway or erroring sensor found via |
Schedule/sensor names are unique only within a repository. If the same name exists in several code locations, the start/stop tools refuse to act and list the candidates; pass
repository_name/location_nameto disambiguate. Successful calls echo the resolvedrepositoryandlocation. |terminate_run| Stop a stuck or runaway run | |reload_code_location| Reload a code location after deploy |
Write tools require
DAGSTER_READ_ONLY=false(default istrue).
How it differs from Dagster's official AI tooling
Dagster builds and supports its own AI tooling. If you are a Dagster+ customer, start with theirs — it is first-party, needs no local runtime, and reaches Dagster+ platform objects (alerting, Issues, Insights) that this project cannot. This project exists mainly for people running open-source / self-hosted Dagster, which the official server's documented setup does not cover.
Everything in the "official" column comes from Dagster's own docs at https://docs.dagster.io/guides/labs/dagster-mcp (retrieved 2026-07-30), or from Dagster directly in #21. Dagster's docs nowhere state that open-source or self-hosted Dagster is unsupported; what they document is a Dagster-hosted URL, a required Dagster-Cloud-Organization header, and a Dagster+ user token. Their capability matrix is a snapshot of today and Dagster expects to keep adding to it, so treat the gaps below as current rather than permanent.
dagster-mcp (this project) | Dagster+ MCP server (official) |
| |
What it is | MCP server you run yourself (Python, MIT) | Dagster-hosted remote MCP endpoint at | An Agent Skill — markdown instructions loaded by your coding agent, not an MCP server |
When you use it | Operations time, against a live instance | Operations time, against a Dagster+ deployment | Development time, against your local codebase |
Works with self-hosted / OSS Dagster | Yes — points at any Dagster webserver ( | Not per the documented setup: the only URL given is Dagster-hosted, and connecting requires a | Yes — Apache-2.0 markdown files you copy locally |
Works with Dagster+ | Yes — sends a | Yes — this is its only documented target | n/a |
Setup | Local process launched by your MCP client (Python 3.12+, e.g. | No local runtime: | Copy the skill files into your agent |
Maturity | v0.8.0 on PyPI (pre-1.0), MIT, single maintainer with occasional outside contributions, "AS IS, WITHOUT WARRANTY OF ANY KIND", no SLA | Labelled by Dagster as Preview: "under active development, and not considered ready for production use… the APIs may change", and published under | Current, no preview label |
Runs | View, launch, terminate, per-step stats, log retrieval, consolidated failure summary | View ✅, Create/Launch ✅, Delete/Terminate ✅, Insights metrics ✅, Update ❌ (Dagster's matrix); run logs View ✅ | n/a |
Assets | View, search, health, resolve selection syntax, and materialize specific assets ( | View ✅ and Insights metrics ✅; Create/Launch, Update and Delete marked ❌ — i.e. no asset-level materialization tool, though launching a run is supported | n/a |
Schedules & sensors | List, tick history, start/stop | Not supported today — confirmed by Dagster, who expect to add it | n/a |
Backfills & partitions | List backfills, launch partitioned jobs, backfill assets over a partition range | Not listed in Dagster's capability matrix | n/a |
Code locations & instance health | List/reload code locations, instance status, daemon heartbeats, queued-run counts | Deployments View ✅ and Insights ✅; code locations and daemon health not listed (Dagster+ manages the daemon) | n/a |
Alerting, Insights, Dagster+ Issues | Not supported — no alerting, cost/Insights metrics, or Issues equivalent | Alert policies and Dagster+ Issues: View / Create / Update / Delete all ✅. Insights metrics ✅ on Runs, Assets and Deployments. All three are documented Dagster+ features (Issues is in limited early access) | n/a |
Multiple instances | Yes — | Deployments within one Dagster+ organization, selected per tool call | n/a |
Write safety | 17 read tools always registered; the 10 write tools are registered only when | Enforced server-side by Dagster+ token permissions. The docs default to a personal user token; a service user is offered as the alternative for scoped, non-human auth (service users are a Dagster+ Pro feature) | n/a |
Support | Best-effort, community, GitHub issues; no SECURITY.md or documented disclosure process | First-party vendor | First-party vendor |
Use the official Dagster+ MCP server if you are on Dagster+ and want alerting, Issues or Insights/cost analysis from an agent, want no local runtime, or need vendor support and a supplier your procurement process will accept.
Use this project if you run open-source or self-hosted Dagster, or you need asset-level materialization, schedule/sensor control, backfills, or code-location and daemon operations from an agent.
For Dagster+ users the two are complementary rather than competing — nothing stops you running both. This project is not affiliated with or endorsed by Dagster Labs.
Compatibility
The monitoring and existing action tools are tested with Dagster 1.6+.
resolve_asset_selection and materialize_assets require Dagster 1.9+ and
verify the required GraphQL capabilities before querying or launching. The
RunsFilter field name (jobName vs pipelineName) is auto-detected via schema
introspection. Configured asset backfills also feature-detect
LaunchBackfillParams.runConfigData and return a clear compatibility error when
an older schema does not expose it. Schedule and sensor start/stop work on
Dagster 1.6+: the stop mutations are sent with the originId/selectorId
argument pair sourced from InstigationState.id/selectorId, which modern
Dagster re-parses as a compound id and older versions accept directly, so no
version branch is needed. The mutations select error messages via the
... on Error interface fragment rather than per-type fragments, because
ScheduleNotFoundError only joined ScheduleMutationResult in Dagster 1.9 and
spreading it on 1.6-1.8 would fail document validation.
Development
uv sync --extra dev
uv run ruff check dagster_mcp/ # lint
uv run pytest # run the test suite
uv run python -m dagster_mcp # start server locallyLicense
MIT
Available Tools
17 toolsget_asset_detailsGet Asset DetailsA
Get detailed metadata for one or more assets: description, lineage, and partitions.
asset_keys: list of asset name strings (e.g. ['my_extract', 'my_load'])
Returns per asset: assetKey, description, groupName, op name, isObservable, isPartitioned, partitionDefinition, dependencyKeys (upstream assets), dependedByKeys (downstream assets), and the latest materialization (runId + timestamp).
When to use: to understand an asset's lineage (what it depends on and what depends on it), check if it's partitioned, or get its description. Use search_assets first if you don't know the exact key.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| asset_keys | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read ('Get') and shows it accepts multiple keys in one call, but it does not state read-only semantics explicitly, behavior on missing/invalid keys, or any auth/rate-limit characteristics. An output schema already exists, so the extensive return-field listing adds little behavioral disclosure beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a parameter bullet, then a 'When to use' block — a clean structure. The long enumeration of return fields is partially redundant given an output schema exists, which costs a little efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the return-value explanation is not strictly needed, but usage and the primary parameter are well covered. The only real gap is the undocumented env parameter, which is minor for a read tool of this shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents asset_keys well, including type and a concrete example (['my_extract', 'my_load']), but the second parameter, env, is never mentioned, leaving half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get detailed metadata for one or more assets') and enumerates what that metadata includes: description, lineage, and partitions. It also distinguishes itself from the sibling search_assets by telling the agent to use that tool first when the key is unknown.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' block gives concrete conditions (understand lineage, check partitioning, get description) and names the alternative (search_assets) with the exact trigger for preferring it. Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_healthGet Asset HealthA
Get a consolidated health view for a single asset or all assets in a group.
This is the BEST tool to assess whether assets are healthy and up-to-date.
asset_key_or_group: pass either a single asset key (e.g. 'my_report') or a group name (e.g. 'analytics'). If it matches a group, returns health for ALL assets in that group.
Returns per asset:
asset_key, group, description
last_materialization: {run_id, timestamp, status} of the latest run
freshness_policy: {maximum_lag_minutes, cron_schedule} if defined
staleness: {is_stale, reasons[]} explaining why the asset is stale
When to use: to check if critical assets are fresh, find stale assets in a group, or verify that recent materializations succeeded. Prefer this over get_recent_materializations when you need a health assessment rather than raw materialization history.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| asset_key_or_group | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the non-obvious behavior that passing a group name expands to health for ALL assets in that group, and explains staleness semantics via the reasons[] field. It does not explicitly state read-only status, permission needs, or cost/latency implications of a group-wide call, so a small gap remains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a scoping note, then a bulleted parameter explanation, then usage guidance. The returns list is somewhat redundant against the output schema but is short and aids scanning; no sentence is wasted and formatting is scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema, the description covers purpose, scope, alternatives, and key result fields well. The only material omission is any mention of the env parameter, which leaves a minor blind spot given 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does so thoroughly for the required asset_key_or_group parameter: dual meaning, concrete examples ('my_report' vs 'analytics'), and the group-expansion consequence. The second parameter, env, is never mentioned in the description or schema, which is the remaining shortfall.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get a consolidated health view') plus the scope ('single asset or all assets in a group'), and explicitly positions itself against siblings by naming get_recent_materializations. An agent can distinguish it from get_asset_details or get_runs without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'When to use' clause (check freshness, find stale assets in a group, verify recent materializations succeeded) and an explicit alternative with the selecting condition ('Prefer this over get_recent_materializations when you need a health assessment rather than raw materialization history'). This is the when/when-not/alternative pattern in full.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instance_statusGet Instance StatusA
Get a global health check of the Dagster instance. START HERE for any monitoring workflow.
Returns:
healthy: boolean — true only if all required daemons are healthy AND no code locations have errors
daemons: list of {type, healthy, last_heartbeat, required} for each daemon (scheduler, sensor, run coordinator, etc.)
queued_runs_count: number of runs waiting in queue (high count = bottleneck)
queued_runs_count_capped: true when the count is a floor rather than exact, which happens only on Dagster versions that do not report a total
code_location_errors: list of {name, error} for locations that failed to load
When to use: as the FIRST call in any diagnostic or monitoring flow. If healthy=false, check daemons for unhealthy entries and code_location_errors for loading failures. Follow up with list_code_locations or get_runs as needed.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it delivers substantive behavioral context the schema cannot: the exact semantics of 'healthy' (all required daemons healthy AND no code location errors), the meaning of a high queued_runs_count, and that queued_runs_count_capped signals a floor rather than exact count on certain versions. It does not state the read-only/side-effect profile explicitly or mention auth or rate limits, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the 'START HERE' directive, then a scannable Returns list and a When-to-use block. Some bullets restate field shapes that the output schema already defines, so it is slightly longer than strictly necessary, but it is well organized and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so enumerating return fields is partly redundant, but the description adds interpretation (bottleneck signal, capped-count caveat, health preconditions) that an agent needs to act on the result. The only real gap is the unexplained 'env' parameter; otherwise the definition is complete for a zero-required-param health check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions the single 'env' parameter, so an agent gets no guidance on what it selects or when to supply it. With one undocumented parameter, the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a global health check of the Dagster instance') and frames the scope as global/instance-level, which cleanly separates it from run-level siblings like get_run_status or get_run_stats. The 'START HERE for any monitoring workflow' line further anchors its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance: first call in any diagnostic or monitoring flow, with a concrete branching rule (if healthy=false, check daemons and code_location_errors) and named follow-ups (list_code_locations, get_runs). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_materializationsGet Recent MaterializationsA
Get the most recent materializations for an asset, with metadata.
Returns a list of materializations, each with: runId, timestamp, assetKey, and metadataEntries (labels, numeric values, text).
asset_key: the asset name as a string (e.g. 'my_daily_report')
limit: max materializations to return (default 5)
When to use: to check when an asset was last materialized, track materialization frequency, or inspect metadata from recent runs. For a broader health view (including staleness and freshness), use get_asset_health instead.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| limit | No | ||
| asset_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the return shape (runId, timestamp, assetKey, metadataEntries) but says nothing about permissions, error behavior for missing assets, or pagination. For an un-annotated read tool this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then structures return fields, parameter notes, and usage guidance as distinct blocks. Every line earns its place and the alternative tool is placed at the end where it belongs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description's return-value detail is a bonus rather than a requirement, and the when-to-use guidance is thorough. The one gap is the undocumented env parameter, which leaves an agent guessing about environment scoping.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents asset_key with a concrete example and explains limit's meaning, which is genuinely helpful, but the third parameter env is left completely unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get the most recent materializations for an asset') with clear scope, and explicitly distinguishes itself from the sibling get_asset_health. An agent can tell what it returns (a list of materializations) without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes an explicit 'When to use' section listing three concrete scenarios (last materialization time, frequency tracking, metadata inspection) and names the alternative get_asset_health for a broader health view. Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_failure_summaryGet Run Failure SummaryA
Get a consolidated failure diagnosis for a run in a single call.
This is the BEST tool to use when investigating a failed or canceled run. It combines status, step stats, and error logs into one response, avoiding the need to call get_run_status + get_run_logs + get_run_stats separately.
Returns:
status, job_name, duration_seconds
failed_steps: list of {step_key, duration, error} for each failed step
root_cause_error: the RunFailureEvent error (if any)
all_step_durations: timing for every step (not just failed ones)
suggestions: automated diagnostic hints (e.g. 'Multiple steps failed', 'Step was retried before failing', 'Run was canceled')
If the run did not fail, returns {message: 'Run did not fail.'}.
When to use: always prefer this over get_run_logs for failed runs. Use get_run_logs only when you need the full event stream.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and it does substantial work: it enumerates the response sections (failed_steps, root_cause_error, all_step_durations, suggestions) and discloses the non-failure behavior ('returns {message: Run did not fail.}'). It does not mention auth requirements or rate limits, but for a read-only diagnostic tool the behavioral surface is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then structured return fields and a when-to-use section. Efficient sections with no filler sentences, though the enumerated return list is somewhat verbose given an output schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the detailed return enumeration is redundant but not harmful. The routing guidance and failure/non-failure behavior make it complete enough to invoke correctly; the only real gap is unexplained parameter semantics, particularly the optional env.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions either parameter. run_id is inferable from context, but env is entirely undocumented in both schema and description — its meaning, valid values, and default behavior are nowhere stated, so the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('consolidated failure diagnosis for a run') and immediately differentiates itself from siblings by naming get_run_status, get_run_logs, and get_run_stats as the calls it replaces. An agent can tell exactly what this tool does and how it differs from adjacent tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('always prefer this over get_run_logs for failed runs'), an explicit exclusion condition for the alternative ('use get_run_logs only when you need the full event stream'), and a scoping statement for investigating failed or canceled runs. Alternatives and their selection criteria are fully enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_logsGet Run LogsA
Get structured log events for a run, with optional severity filtering and pagination.
Returns events with __typename, timestamp, message, level, and (where applicable) stepKey and error details. Events include step starts/completions, failures, retries, materializations, and run-level events. EngineEvent events also carry metadataEntries — a list of {label, description, value} dicts (e.g. run worker image, k8s pod name, step keys) surfaced by the engine.
Parameters:
run_id: the run to fetch logs for
level_filter: only return events at this level or above, ordered DEBUG < INFO < WARNING < ERROR < CRITICAL. Filtering at 'WARNING' therefore also returns ERROR and CRITICAL events. ExecutionStepFailureEvent and RunFailureEvent are always included when filtering at 'ERROR' or below, regardless of their own level field. Default: None (return all events).
cursor: pagination cursor returned in previous response. Pass the cursor from the last call to get the next page.
limit: max events per page (default 100)
When to use: to investigate what happened during a run. For a quick failure diagnosis, prefer get_run_failure_summary instead — it returns a consolidated view in a single call. Use get_run_logs when you need the full event stream or want to filter by level.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| limit | No | ||
| cursor | No | ||
| run_id | Yes | ||
| level_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it enumerates the returned fields (__typename, timestamp, message, level, stepKey, error details) and event categories, and discloses two non-obvious behaviors — the level_filter ordering semantics and that ExecutionStepFailureEvent/RunFailureEvent are always included at ERROR or below regardless of their level. It never explicitly states that the operation is read-only or what happens on a missing/invalid run_id, which is the remaining gap given zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line capability statement, then return contents, then a labeled parameter list, then a labeled 'When to use' block. No sentence is redundant and the structured layout makes the tool skimmable despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only log-retrieval tool with no annotations, the description supplies return contents, filtering semantics, pagination mechanics, and sibling routing. The output schema exists, so the return-value detail is bonus rather than a requirement, and nothing an agent needs to call this correctly is missing apart from the minor env omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has to compensate, and it does for 4 of the 5 parameters — level_filter gets a thorough semantic explanation (ordering, threshold behavior, always-included failure events, default) and cursor/limit/run_id are all clarified. The env parameter is never mentioned in either the schema or the description, so one parameter remains completely opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get structured log events for a run') plus the return shape, and explicitly distinguishes itself from the nearest sibling, get_run_failure_summary. An agent can separate this tool from the other 16 siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'When to use' section that names the alternative (get_run_failure_summary) and the exact condition that selects it ('quick failure diagnosis'), then states when this tool is preferred ('full event stream or want to filter by level'). Both directions of the routing decision are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runsGet RunsA
List recent pipeline runs. Start here to discover what has been running.
Returns runId, status, jobName, startTime, endTime, and tags for each run. Use the returned runId to drill into details with get_run_status, get_run_logs, get_run_stats, or get_run_failure_summary.
Filtering:
job_name: filter by job (e.g. 'my_etl_job')
statuses: filter by one or more statuses. Valid values: 'SUCCESS', 'FAILURE', 'CANCELED', 'STARTED', 'QUEUED', 'STARTING', 'CANCELING', 'NOT_STARTED'. Examples: ['FAILURE'], ['FAILURE', 'CANCELED'], ['STARTED', 'QUEUED']
limit: max runs to return (default 10)
Typical workflows:
Find recent failures: get_runs(statuses=['FAILURE'])
Check if a job ran today: get_runs(job_name='my_job', limit=5)
Monitor active runs: get_runs(statuses=['STARTED', 'QUEUED'])
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| limit | No | ||
| job_name | No | ||
| statuses | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It discloses the returned fields (runId, status, jobName, startTime, endTime, tags) and the limit default, which is genuinely useful, but says nothing about pagination/result caps, ordering guarantees, or what the 'env' scope does. For a list tool the safety profile is low risk, so this is adequate but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then return fields, then sibling routing, then grouped filtering, then worked examples. Every line is scannable and none is filler; the example block earns its space by making the filter syntax unambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not strictly required, yet the description still names the fields, which is a bonus. Combined with the status enum and examples, an agent has nearly everything needed; the only real omission is any guidance on the undocumented 'env' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: job_name is explained with an example, statuses enumerates all eight valid values with example lists, and limit documents its default of 10. The gap is 'env', which is neither described in the schema nor mentioned in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('List recent pipeline runs') and immediately distinguishes itself from the many get_run_* siblings by declaring itself the entry point ('Start here to discover what has been running') and routing detailed lookups elsewhere. An agent can place it in the tool family without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the four drill-down alternatives (get_run_status, get_run_logs, get_run_stats, get_run_failure_summary) and chains to them via runId, then supplies three concrete invocation patterns ('Find recent failures', 'Check if a job ran today', 'Monitor active runs'). The when-to-use decision is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_statsGet Run StatsA
Get per-step execution statistics for a run: timing, materializations, and expectations.
Returns runId, status, and a stepStats array where each entry has: stepKey, status, startTime, endTime, materializations (with labels), and expectationResults (with success flag and labels).
When to use: to find slow steps (compare startTime/endTime), check which steps materialized assets, or verify expectation results. For failed runs, prefer get_run_failure_summary which includes step stats alongside error details and suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add helpful behavioral context by detailing the returned stepStats structure and practical use cases, and the 'Get' verb implies a read operation. However, it does not explicitly state read-only status, side-effect profile, permission requirements, or rate limits, leaving gaps in operational transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by a structured return summary and a clear usage paragraph. It is well organized, though the return-field detail is somewhat redundant given the presence of an output schema, and could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema and no annotations, the description covers purpose, usage, return shape, and sibling routing well. However, it leaves the optional env parameter completely unexplained and provides no explicit safety or permission context, so important gaps remain for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both input parameters, and the description does not explain the required run_id or the optional env parameter. It mentions a 'run' conceptually but adds no format, default, or selection semantics beyond what the bare schema already encodes, so the parameter gap is entirely unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get per-step execution statistics for a run') and enumerates the data returned (timing, materializations, expectations). It also explicitly distinguishes itself from a sibling, get_run_failure_summary, making the scope clear without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: find slow steps, check which steps materialized assets, or verify expectation results. It also names the preferred alternative for failed runs and the condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_statusGet Run StatusA
Get full details for a single run: status, config, tags, and run lineage.
Returns: runId, status, startTime, endTime, jobName, tags, runConfigYaml, rootRunId, parentRunId, resolvedOpSelection.
Use rootRunId and parentRunId to understand re-execution chains — if parentRunId is set, this run was re-executed from another run. resolvedOpSelection shows which steps were selected for re-execution.
When to use: after get_runs to inspect a specific run, or to check whether a run is a re-execution of a previous one.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers real behavioral context: it explains that parentRunId signals re-execution and what resolvedOpSelection means, which goes beyond the structured fields. It still omits error behavior for an unknown run_id and any permission/auth expectations, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and organized into a purpose line, a Returns list, interpretation notes, and a When-to-use line, so it scans well. The Returns field enumeration partially duplicates the output schema, which is slight redundancy rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the description need not explain return values, and instead spends its budget on lineage semantics and usage routing, which is the right allocation. The one real hole is the undocumented env parameter, which leaves an agent guessing at its meaning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are two parameters: run_id is only loosely implied by 'a single run', and env is never mentioned anywhere in the description or schema. For a tool where the schema provides no parameter documentation, the description should have compensated and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get full details for a single run') and enumerates the payload (status, config, tags, lineage), which clearly separates it from the list-oriented get_runs. It does not explicitly contrast with close siblings like get_run_logs or get_run_stats, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' clause gives an explicit trigger ('after get_runs to inspect a specific run') and a second concrete use case (checking whether a run is a re-execution). It names the upstream alternative get_runs but gives no exclusions against the other get_run_* siblings, so routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tick_historyGet Tick HistoryA
Get recent tick history for a schedule or sensor — essential for detecting silent failures.
instigator_name: exact name of the schedule or sensor (from list_schedules/list_sensors)
instigator_type: 'SCHEDULE' or 'SENSOR'
limit: max ticks to return (default 20)
repository_name / location_name: optional, to disambiguate when the same name exists in several code locations (see list_schedules/list_sensors)
Returns per tick: tick_id, status (SUCCESS/FAILURE/SKIPPED), timestamp, error message (if failed), and run_ids (runs launched by this tick).
When to use: when a schedule or sensor is RUNNING but data is not being produced. Common patterns to look for:
All ticks SKIPPED: sensor condition not met, or misconfigured
Ticks with FAILURE status: the schedule/sensor code is erroring
Ticks with SUCCESS but empty run_ids: sensor evaluated but decided not to launch
Missing ticks: daemon may be unhealthy (check get_instance_status)
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| limit | No | ||
| location_name | No | ||
| instigator_name | Yes | ||
| instigator_type | Yes | ||
| repository_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it enumerates the returned fields (tick_id, status, timestamp, error, run_ids) and, more importantly, explains how to interpret each status/run_ids combination. It does not cover auth requirements, rate limits, or the read-only nature explicitly, so it falls just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then organized into a parameter block and a diagnostic block. Every bullet on interpretation carries signal, though the description runs somewhat long relative to a six-parameter read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value structure need not be spelled out, yet the description still adds interpretive meaning on top of it. Nearly complete for correct invocation, with the undocumented 'env' parameter the only notable omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents five of six parameters including the effective enum for instigator_type ('SCHEDULE' or 'SENSOR') and the disambiguation role of repository_name/location_name. The 'env' parameter is never mentioned, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get recent tick history for a schedule or sensor') and immediately frames the diagnostic goal ('detecting silent failures'). This cleanly separates it from get_runs/get_run_logs, which operate on runs rather than ticks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use: when a schedule or sensor is RUNNING but data is not being produced' plus four named diagnostic patterns that map observed results to causes. It also routes to a sibling alternative ('Missing ticks: daemon may be unhealthy — check get_instance_status') and names list_schedules/list_sensors as the source of valid names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_backfillsList BackfillsB
List recent asset backfills with their status and partition progress.
Returns per backfill: backfillId, status, numPartitions, timestamp, partitionNames, and partitionSetName.
limit: max backfills to return (default 10)
When to use: to monitor in-progress backfills or review recent ones.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only list operation but doesn't confirm safety, auth requirements, pagination, or behavior details. Only the return fields are listed, which is more about output than behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then lists return fields and the limit parameter, and finishes with 'When to use.' Generally efficient, though listing all return fields is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param tool with no annotations and a documented output schema, the description covers purpose and one parameter but omits 'env', auth/prereqs, and sibling routing. It's adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description should compensate. It explains 'limit: max backfills to return (default 10),' adding meaning for one parameter. The 'env' parameter is entirely undocumented in both schema and description, leaving a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List recent asset backfills with their status and partition progress'), clearly distinguishing it from run-oriented siblings like get_runs or get_recent_materializations. It's a bit generic but the resource domain (backfills) is unique among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides 'When to use: to monitor in-progress backfills or review recent ones,' which gives implied usage context. However, it doesn't contrast against alternatives (e.g., get_recent_materializations or get_runs) or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_code_locationsList Code LocationsA
List all code locations and their load status.
Returns per location: name, loadStatus (LOADED/LOADING), and either the repositories within it or a PythonError if loading failed.
When to use: after a deployment to verify code locations loaded correctly, or when get_instance_status reports code location errors. If a location failed to load, use reload_code_location to retry.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full behavioral burden. It does describe return shape (name, loadStatus enum values, repositories or PythonError), which is useful, but since an output schema exists the return detail is somewhat redundant with structured data. It adds the load-failure retry path, a genuinely useful behavioral fact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded 'List all...' then return details then usage. Every sentence earns its place; no waste. Slightly dense but structured well.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be fully enumerated in prose (though they are). The description covers the main usage scenarios and a successor tool, but omits any mention of the env parameter, leaving a small but notable gap for an otherwise simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional param (env) with 0% schema description coverage, but the value should come from the description. The description mentions nothing about env, leaving the sole parameter undocumented. Baseline for a single optional param is modest, but this gap is a real loss.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (code locations and their load status). It doesn't explicitly differentiate from sibling list tools, but no sibling covers code locations, so the resource itself is distinct enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives 'When to use' triggers (after deployment, when get_instance_status reports errors) and names a related sibling action (reload_code_location). No 'when-not-to-use', but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsList JobsA
List jobs across code locations, optionally filtered by repository or location.
Returns per job: repository name, code location name, job name, and description. repository_name and location_name are independent exact-match filters; when both are supplied, a job must match both.
An empty result when filtering means no match was found among loaded code locations. If a code location relevant to the filter failed to load or is still loading, list_jobs raises instead of silently reporting no jobs — check list_code_locations for details. Calling with no filters lists whatever is loaded and never raises for a broken location; use list_code_locations or get_instance_status to check load health directly.
When to use: as a starting point to explore what jobs exist, or to find the exact job name and repository_location needed for launch_job.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| location_name | No | ||
| repository_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that filtered calls raise when a relevant code location failed to load or is still loading, while an unfiltered call never raises. It also defines empty-result semantics, though it omits pagination or read-only confirmation beyond the implied 'List'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the returned fields, then filtering semantics, then edge cases, then usage. Every sentence is substantive, with only minor repetition around 'check list_code_locations' appearing twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be documented, yet the description usefully names the per-job fields anyway. Filtering, error behavior, and usage are all covered; only the env parameter and pagination behavior remain unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for two of three params: repository_name and location_name are independent exact-match filters that combine with AND semantics. The env parameter is never explained in either schema or description, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List jobs across code locations') plus the optional filter dimensions. It also names the related siblings (list_code_locations, get_instance_status, launch_job) so the agent can distinguish this from its neighbors without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has an explicit 'When to use' section: as a starting point to explore jobs, or to find the exact job name and repository_location needed for launch_job. It also clarifies the alternative path (use list_code_locations or get_instance_status to check load health), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schedulesList SchedulesA
List all schedules with their status, cron expression, target job, and next tick.
Returns per schedule: name, cron expression, status (RUNNING/STOPPED), next_tick timestamp, target job name, repository, and code location.
When to use: to check which schedules are active, verify cron timing, or find schedules that are stopped and might need attention. If a schedule is RUNNING but jobs aren't executing, use get_tick_history to inspect recent ticks for errors. Raises when a code location is unavailable rather than returning a partial list that could be mistaken for the complete set of schedules.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose an important failure semantic: it raises when a code location is unavailable instead of returning a partial list that could be mistaken for complete. It does not cover auth requirements, rate limits, or pagination, so it falls short of fully compensating for the missing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded and organized into purpose, return shape, and when-to-use. Slightly redundant: the opening sentence lists the same fields (status, cron expression, target job, next tick) that the following 'Returns per schedule' sentence re-enumerates in expanded form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema present, the description covers purpose, usage routing, and error behavior adequately, and its return-value detail is optional redundancy rather than a gap. The one real omission is any explanation of the 'env' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter ('env') at 0% schema description coverage, and the description never mentions it — no guidance on what environment values are valid, what the default null means, or whether it scopes the listing. The schema does not compensate, so the agent is left guessing about the tool's only input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all schedules') and enumerates the exact fields returned (status, cron expression, target job, next tick), which lets an agent distinguish it from siblings like list_jobs or list_sensors without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' block names three concrete scenarios (check active schedules, verify cron timing, find stopped schedules) and routes the agent to get_tick_history for the specific failure mode of a RUNNING schedule whose jobs aren't executing. That is a named alternative plus the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sensorsList SensorsA
List all sensors with their status and target jobs.
Returns per sensor: name, status (RUNNING/STOPPED), list of target job names, repository, and code location.
When to use: to check which sensors are active and what jobs they trigger. If a sensor is RUNNING but not producing runs, use get_tick_history to inspect recent ticks — it will show skipped ticks, errors, or runs launched. Raises when a code location is unavailable rather than returning a partial list that could be mistaken for the complete set of sensors.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose a meaningful failure trait: it raises when a code location is unavailable rather than returning a partial list that could be mistaken for the complete set. It does not state read-only semantics, permissions, or whether the env parameter affects visibility, but the error contract is a genuinely useful disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then returns, then usage, then edge-case behavior — a clean progression with no filler. The return-field enumeration is somewhat redundant given an output schema exists, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, alternative routing, and error semantics well enough for an agent to call it correctly, and the output schema means return values did not need restating. The only real gap is the undocumented env parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (env) with 0% schema description coverage, so the description is the only place its meaning could be explained — and it never mentions env at all. The rich description of return fields does not compensate for the undocumented input parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all sensors') plus scope ('with their status and target jobs'), and enumerates the returned fields so an agent knows exactly what it gets. It is clearly distinguishable from siblings like list_jobs, list_schedules, and get_tick_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' clause (check which sensors are active and what jobs they trigger) and names the alternative tool get_tick_history with the exact condition that selects it (RUNNING but not producing runs). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_asset_selectionResolve Asset SelectionA
Resolve Dagster asset-selection syntax into concrete assets without launching a run.
Supported syntax:
key predicates (
key:ordersor bareorders) with*wildcardsgroup:,tag:,kind:, andowner:predicatescase-insensitive
and,or, andnotwith parenthesesroots(...)andsinks(...)upstream/downstream traversal such as
+orders,2+orders,orders+,orders+2, or1+orders+2
Returns asset_keys as slash-delimited strings ready to pass to
materialize_assets or backfill_assets, plus compact GraphQL-shaped asset
summaries. This tool is read-only and does not filter external, observable,
non-executable, or partitioned matches.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| asset_selection | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It states it is read-only, does not launch a run, and does not filter external/observable/non-executable/partitioned matches. However, it does not state authentication requirements, rate limits, or potential side effects beyond no launch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, followed by a structured syntax list and return information. It is appropriately sized for a complex syntax tool, though the syntax examples could be slightly condensed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (syntax parsing) and that an output schema exists, the description is nearly complete: it explains syntax, return format, and read-only behavior. It misses guidance on the 'env' parameter and explicit when-to-use vs alternatives, but covers the core resolution behavior well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so parameters are undocumented. The description provides extensive detail about the supported syntax for 'asset_selection', but does not explain the 'env' parameter or the expected format for asset_selection's top-level structure beyond syntax examples. This partially compensates but leaves the env parameter ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve), resource (Dagster asset-selection syntax into concrete assets), and explicitly distinguishes from launching a run. This clearly differentiates it from 'search_assets' and other read-only tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: it resolves syntax without launching a run and its output is ready to pass to materialize_assets or backfill_assets. However, it does not explicitly name when to use this vs search_assets or how it differs from listing assets via get_asset_details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_assetsSearch AssetsA
Search and list assets by name prefix or group. Use this to discover assets.
Returns per asset: assetKey, groupName, description, isPartitioned, op name.
prefix: case-insensitive substring match on any part of the asset key (e.g. 'raw_' finds 'raw_orders', 'raw_users')
group: exact match on groupName (case-insensitive, e.g. 'analytics')
Both filters can be combined.
If neither is passed, returns ALL assets.
When to use: to discover available assets before calling get_asset_details or get_asset_health. Use prefix for fuzzy search, group for scoped listing.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| group | No | ||
| prefix | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and mostly does: it discloses case-insensitive substring matching, exact group matching, combinability, and that passing neither filter returns ALL assets. That unbounded-default disclosure is genuinely useful. It stops short of pagination, result limits, or whether ordering is guaranteed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by tight bullets, with the highest-value routing guidance last. The 'Returns per asset: ...' line partially duplicates the output schema and is the one sentence that does not fully earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and the description nonetheless covers discovery intent, filter semantics, and the default-all behavior. Missing only pagination/limit behavior and any explanation of the 'env' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it documents prefix and group well, including matching semantics and examples. However, the third parameter 'env' is never mentioned in either the schema or the description, leaving a genuine gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search and list assets') and scopes it to two filter modes, name prefix and group. It also names the siblings it precedes (get_asset_details, get_asset_health), so the agent can separate discovery from detail/health lookups without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' section names the downstream tools it feeds and prescribes which filter to pick ('prefix for fuzzy search, group for scoped listing'). It also states the no-filter fallback, removing the main ambiguity for an all-optional-parameter tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.10.0- Changed
list_jobs6 fields changed- added
Input schema / properties / location_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / repository_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Output schema / properties / result / items / additionalPropertiesRemoved value: -true - added
Output schema / properties / result / items / descriptionAdded value: +"Public job metadata returned by :func:`list_jobs`." - added
Output schema / properties / result / items / propertiesAdded value: +{ + "description": { + "type": "string" + }, + "job": { + "type": "string" + }, + "location": { + "type": "string" + }, + "repository": { + "type": "string" + } +} - added
Output schema / properties / result / items / requiredAdded value: +[ + "repository", + "location", + "job", + "description" +]
17 tool updates
v0.8.0- First observed
get_asset_details - First observed
get_asset_health - First observed
get_instance_status - First observed
get_recent_materializations - First observed
get_run_failure_summary - First observed
get_run_logs - First observed
get_run_stats - First observed
get_run_status - First observed
get_runs - First observed
get_tick_history - First observed
list_backfills - First observed
list_code_locations - First observed
list_jobs - First observed
list_schedules - First observed
list_sensors - First observed
resolve_asset_selection - First observed
search_assets
TDQS
Scored across 17 tools
Run-inspection tools (get_runs, get_run_status, get_run_logs, get_run_stats, get_run_failure_summary) overlap in scope, but the descriptions explicitly cross-reference each other and state when to prefer one over another (e.g. get_run_failure_summary over get_run_logs). Asset tools (search_assets, get_asset_details, get_asset_health, get_recent_materializations) are similarly well-delineated. Only mild potential confusion remains between stats/logs/failure_summary for a failed run.
All tools follow a consistent snake_case verb_noun pattern (get_runs, list_schedules, search_assets, resolve_asset_selection, get_instance_status). Verbs are used predictably: list_/search_ for discovery, get_ for detail, resolve_ for computation. No mixed conventions.
17 tools is on the heavier side but each covers a distinct slice of Dagster monitoring (runs, assets, schedules, sensors, ticks, code locations, instance health). Nothing feels redundant, though the set is slightly large for a read-only monitoring surface.
Read/observability coverage is strong, but several descriptions reference tools that are absent from the set (materialize_assets, backfill_assets, launch_job, reload_code_location), creating dead-end references an agent may follow. No write/action tools exist despite the server hinting at them, so lifecycle coverage is incomplete.
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Let AI agents query data and act across all your business apps via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA multi-agent MCP server that turns LLMs into an autonomous incident-response copilot, enabling rapid investigation, correlation, and remediation of production incidents.MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server providing intelligence infrastructure for AI agent pipelines, including vector memory, drift detection, model routing, skills discovery, session management, codebase indexing, and context compression, all running locally with zero LLM/API calls.1MIT
- AlicenseAqualityDmaintenanceAn intelligent MCP server that gives AI agents full control over GitHub Actions CI/CD pipelines, including real-time monitoring, log analysis, AI-powered failure diagnosis, and deployment management.13291 npm1ISC
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI agents real-time observability into Apache Kafka clusters, enabling natural language queries for broker health, consumer lag, and diagnostics.MIT