关于 Dagster Mcp
该 MCP 服务让 AI Agent 监控并操作 Dagster 实例,涵盖运行、资产、作业、调度器、传感器和实例健康状况。支持多个环境,并可通过配置启用写操作。
主要功能
- 01查询运行状态、日志与失败摘要
- 02搜索资产并检查健康度
- 03查看作业、调度器和传感器
- 04检查实例及代码位置状态
- 05操作运行、资产和调度组件
- 06配置多个 Dagster 环境
适用场景
- 01诊断失败的数据管道运行
- 02发现过期或不健康的资产
- 03检查未触发的调度和传感器
- 04启动作业或停止卡住的运行
MCP 相关
该 MCP 服务向 MCP 客户端提供 Dagster 运行、资产、作业、调度器、传感器和实例管理工具。默认仅开放读取工具;将 DAGSTER_READ_ONLY 设为 false 可启用写操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
17收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| env | any | 否 | |
| limit | integer | 否 | |
| job_name | any | 否 | |
| statuses | any | 否 |
详细介绍
Dagster MCP
一个 MCP 服务,让 AI Agent 全面查看和控制你的 Dagster 实例——就像是数据管道的 SRE。
兼容任何 MCP 客户端:Claude Code、Claude Desktop、Cursor 等。
Dagster 官方开发并支持自己的 Dagster Plus MCP 服务。请参阅此处的文档。
为什么要开发它
数据管道会在凌晨 3 点发生故障。计划任务可能悄无声息地停止触发。资产会变得陈旧。与其醒来后面对满屏红色的仪表盘,不如为 AI Agent 提供工具,让它自主监控、诊断和修复你的 Dagster 实例。
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: STOPPED
功能
提供 6 类共 27 个工具,专为自主 DataOps 工作流设计:
| 类别 | 工具 | Agent 可以执行的操作 |
|---|---|---|
| 运行 | get_runs get_run_status get_run_logs get_run_stats get_run_failure_summary | 查找故障、诊断根本原因、检查日志和步骤耗时 |
| 资产 | search_assets resolve_asset_selection get_asset_details get_recent_materializations get_asset_health | 发现资产、预览沿袭选择、检查新鲜度、检测陈旧数据 |
| 作业 | list_jobs | 查看不同代码位置中的作业清单,可选按存储库或位置筛选 |
| 计划任务与传感器 | list_schedules list_sensors get_tick_history | 检测无声故障、遗漏的触发和传感器错误 |
| 实例 | get_instance_status list_code_locations list_backfills | 全局运行状况检查、守护进程状态、代码位置错误 |
| 操作 | materialize_assets backfill_assets launch_job launch_job_with_partitions terminate_run start_schedule stop_schedule start_sensor stop_sensor reload_code_location | 使用配置物化具体资产、回填分区、启动作业、停止卡住的运行、启动或停止计划任务和传感器、部署后重新加载 |
操作默认关闭:设置
DAGSTER_READ_ONLY=false以启用写入操作。
快速开始
前提条件
安装
此软件包已发布到 PyPI。
选项 A — 使用 uvx 直接运行(无需安装):
uvx dagster-mcp
选项 B — 使用 pip 安装:
pip install dagster-mcp
选项 C — 克隆并运行:
git clone https://github.com/fabdendev/dagster-mcp.git
cd dagster-mcp
uv sync
配置
单一环境
| 变量 | 说明 | 默认值 |
|---|---|---|
DAGSTER_URL | Dagster 实例的基础 URL | http://localhost:3000 |
DAGSTER_API_TOKEN | Dagster Cloud API 令牌(自托管时留空) | (empty) |
DAGSTER_EXTRA_HEADERS | 要发送至 Dagster GraphQL 的额外请求头 JSON 对象 | (empty) |
DAGSTER_READ_ONLY | 为 true 时,仅提供读取工具(不提供启动/终止/重新加载操作,也不提供启动/停止计划任务或传感器的操作) | true |
自托管:
export DAGSTER_URL=http://localhost:3000
Dagster Cloud:
export DAGSTER_URL=https://myorg.dagster.cloud/prod
export DAGSTER_API_TOKEN=your-dagster-cloud-user-token
自定义身份验证/代理请求头:
export DAGSTER_EXTRA_HEADERS='{"Authorization":"Bearer your-token","X-My-Header":"value"}'
多个环境
使用 DAGSTER_ENVS 在一台服务器中配置多个 Dagster 实例。之后,每个工具都会接受可选的 env 参数,以便 LLM 定位到正确的实例。
| 变量 | 描述 | 默认值 |
|---|---|---|
DAGSTER_ENVS | 将环境名称映射到 {url, token?, extra_headers?} 配置的 JSON 对象 | (空) |
DAGSTER_DEFAULT_ENV | 未向工具传递 env 时使用的环境名称 | (空) |
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=prod
设置 DAGSTER_ENVS 后,DAGSTER_URL / DAGSTER_API_TOKEN / DAGSTER_EXTRA_HEADERS 将被忽略。如果只定义了一个环境,即使未设置 DAGSTER_DEFAULT_ENV,也会自动使用该环境。
添加到 MCP 客户端
Claude Code
添加到 ~/.claude/settings.json:
单个环境:
{
"mcpServers": {
"dagster": {
"command": "uvx",
"args": ["dagster-mcp"],
"env": {
"DAGSTER_URL": "http://localhost:3000"
}
}
}
}
多个环境:
{
"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"
}
}
}
}
Claude Desktop
添加到 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"
}
}
}
}
工具参考
Runs
| 工具 | 描述 |
|---|---|
get_runs | 列出最近的运行,可按作业名称和/或状态筛选 |
get_run_status | 获取状态、配置、标签和运行沿袭关系(通过 rootRunId/parentRunId 查看重新执行链) |
get_run_logs | 获取带分页和可选级别筛选(ERROR、WARNING、INFO)的结构化日志事件;EngineEvent 事件包含 metadataEntries |
get_run_stats | 获取逐步执行统计信息:耗时、物化结果和预期结果 |
get_run_failure_summary | 综合故障诊断——通过一次调用获取失败步骤、根因错误、步骤耗时和建议 |
Assets
| 工具 | 描述 |
|---|---|
search_assets | 按键前缀或组名称查找资产 |
resolve_asset_selection | 将键/组/标签/类型/所有者谓词、通配符、布尔逻辑、根节点/汇节点和沿袭遍历解析为具体资产键,不会启动任何操作 |
get_asset_details | 获取描述、上游/下游依赖关系、分区和最新物化结果 |
get_recent_materializations | 获取资产的物化历史记录及元数据 |
get_asset_health | 综合健康视图——查看过期情况、新鲜度策略和上次运行状态(适用于单个资产或整个组) |
两步资产工作流
首先解析并检查选择表达式:
resolve_asset_selection(
asset_selection="group:analytics and (kind:dbt or key:*benchmark)"
)
→ {
"asset_keys": [
"warehouse/analytics/orders",
"warehouse/analytics/reranker_benchmark"
],
"assets": [...]
}
对于具体的非分区资产,将返回的键以及所需的启动配置和标签传递给
materialize_assets:
materialize_assets(
asset_keys=[
"warehouse/analytics/orders",
"warehouse/analytics/reranker_benchmark"
],
run_config={"ops": {"benchmark": {"config": {"limit": 1000}}}},
tags={"triggered_by": "agent"}
)
对于分区资产,则将相同的已解析键传递给
backfill_assets:
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。
它会返回外部、可观察、不可执行和分区匹配项,以便调用方检查完整结果。写入工具会在执行前重新获取当前资产定义。resolve_asset_selection 和 materialize_assets 要求 Dagster 1.9+。
作业、计划与传感器
| 工具 | 说明 |
|---|---|
list_jobs | 列出各代码位置中的作业,可选按精确的 repository_name 和/或 location_name 筛选(用于查找 launch_job 所需的名称) |
list_schedules | 列出计划及其状态(RUNNING/STOPPED)、cron、目标作业和下一次触发时间 |
list_sensors | 列出传感器及其状态和目标作业 |
get_tick_history | 查看计划或传感器逐次触发的历史记录——检测无声故障的关键工具。可选传入 repository_name / location_name,以区分多个代码位置中同名的对象 |
list_jobs 的筛选条件相互独立,组合使用时采用 AND 语义。例如,list_jobs(repository_name="example_repository") 会跨代码位置查找该存储库,而 list_jobs(repository_name="example_repository", location_name="example_location") 则指定一个存储库与代码位置组合。只使用一个筛选条件的调用会先发送轻量级的存储库发现请求,再批量请求作业信息;这并非免费:它会多产生一次与 Dagster 的往返请求,以便在只有部分存储库匹配时缩小负载。每次调用的请求数:无筛选条件时为 1,同时使用两个筛选条件时为 1,仅使用一个筛选条件时为 2。
如果与筛选条件相关的代码位置加载失败或仍在加载,list_jobs 会抛出包含该位置名称的 RuntimeError,而不是悄然返回空结果——筛选结果为空,意味着 Dagster 实际能够加载的代码位置中没有匹配项。筛选结果非空时,仍可能不完整:如果有些存储库匹配,list_jobs 就会返回这些存储库,而不会抛出异常,即使另一个代码位置无法搜索也是如此。此检查会随上述相同请求一并进行(workspaceOrError,list_code_locations 本来就会查询它),因此不会增加额外的往返请求。不带筛选条件的调用(无筛选条件的 list_jobs())保持不变:它会省略此检查,并继续返回当前已加载的所有内容,因为 Agent 不会像误读空筛选结果那样,把冗长的清单误读为“什么都不存在”——可使用 list_code_locations 或 get_instance_status 直接检查加载状态。
实例与代码位置
| 工具 | 说明 |
|---|---|
get_instance_status | 从这里开始——全局运行状况:守护进程状态、排队的运行数、代码位置错误 |
list_code_locations | 列出所有代码位置及其加载状态 |
list_backfills | 列出近期回填及其状态和分区进度 |
写入操作
| 工具 | 描述 |
|---|---|
materialize_assets | 使用运行配置和标签启动具体的未分区资产键;推断一个兼容的仓库/作业,包含兼容的检查,并扩展必需的不可子集多资产邻项。启动失败时,不会抛出异常,而是返回预检上下文以及 error 和 message,并省略 launched_asset_keys |
backfill_assets | 按资产选择启动分区回填,可选运行配置;在服务端遵循每个资产的 BackfillPolicy |
launch_job | 启动指定名称的作业;为保持兼容,仍支持 asset_keys,并通过 GraphQL assetSelection 传递,但更推荐使用两步资产工作流 |
launch_job_with_partitions | 为一个或多个分区键启动分区作业;创建回填(支持使用 from_failure 仅重试失败的步骤) |
start_schedule | 启动(启用)一个调度,使其按 cron 启动运行 |
stop_schedule | 停止(禁用)一个调度——状态会在重启后保留;不会终止正在运行的任务 |
start_sensor | 启动(启用)一个传感器,使其恢复评估 |
stop_sensor | 停止(禁用)一个传感器——通过 get_tick_history 发现失控或报错的传感器时,可使用此工具将其停止 |
调度/传感器名称仅在仓库内唯一。如果多个代码位置存在同名对象,启动/停止工具会拒绝操作并列出候选项;传入
repository_name/location_name可消除歧义。调用成功时会回显解析出的repository和location。 |terminate_run| 停止卡住或失控的运行 | |reload_code_location| 部署后重新加载代码位置 |
写入工具要求
DAGSTER_READ_ONLY=false(默认为true)。
与 Dagster 官方 AI 工具的区别
Dagster 构建并支持自己的 AI 工具。如果你是 Dagster+ 客户,请优先使用官方工具——它们由 Dagster 一方提供,无需本地运行时,并且可以访问 Dagster+ 平台对象(警报、Issues、Insights),而本项目无法访问这些对象。本项目主要面向运行开源/可自托管 Dagster 的用户;官方服务器文档中的设置说明未涵盖这类用户。
“官方”列中的所有内容均来自 Dagster 自己的文档 https://docs.dagster.io/guides/labs/dagster-mcp(检索日期:2026-07-30),或来自 Dagster 在 #21 中的直接说明。Dagster 的文档并未声明不支持开源或可自托管的 Dagster;文档说明的是由 Dagster 托管的 URL、必需的 Dagster-Cloud-Organization 标头,以及 Dagster+ 用户令牌。其功能矩阵只是当前情况的快照,Dagster 也预计会继续扩展功能,因此请将下方的差异视为当前情况,而非永久不变。
| dagster-mcp(本项目) | Dagster+ MCP 服务(官方) | dagster-expert skill(官方) | |
|---|---|---|---|
| 它是什么 | 由你自行运行的 MCP 服务(Python,MIT) | 由 Dagster 托管的远程 MCP 端点:https://mcp.agent.dagster.cloud/mcp | 一种 Agent Skill——由编码 Agent 加载的 Markdown 指令,而非 MCP 服务 |
| 使用时机 | 运维期间,针对正在运行的实例 | 运维期间,针对 Dagster+ 部署 | 开发期间,针对你的本地代码库 |
| 适用于自托管 / OSS Dagster | 是 — 可指向任何 Dagster Web 服务器(DAGSTER_URL,默认值为 http://localhost:3000;会追加 /graphql)。无需令牌 | 根据文档中的设置,不适用:唯一提供的 URL 由 Dagster 托管,连接时需要 Dagster-Cloud-Organization 标头和 Dagster+ 用户令牌 | 是 — Apache-2.0 Markdown 文件,可复制到本地 |
| 适用于 Dagster+ | 是 — 会发送 Dagster-Cloud-Api-Token 标头;可通过 DAGSTER_EXTRA_HEADERS 添加其他标头 | 是 — 这是其文档中唯一支持的目标 | 不适用 |
| 设置 | 由 MCP 客户端启动的本地进程(Python 3.12+,例如 uvx dagster-mcp),通过环境变量配置 | 无需本地运行时:claude mcp add --transport http dagster-plus https://mcp.agent.dagster.cloud/mcp --header "Dagster-Cloud-Organization: …" --header "Authorization: Bearer …" | 将 skill 文件复制到你的 Agent 中 |
| 成熟度 | PyPI 上的 v0.8.0(未达 1.0),MIT,由一位维护者维护,偶有外部贡献,按“原样”提供,不提供任何形式的保证,无 SLA | Dagster 标注为预览版:“正在积极开发中,尚未准备好用于生产……API 可能会发生变化”,并发布在 /guides/labs/ 下 | 当前版本,无预览版标记 |
| 运行 | 查看、启动、终止、逐步统计、日志检索、汇总故障摘要 | 查看 ✅、创建/启动 ✅、删除/终止 ✅、Insights 指标 ✅、更新 ❌(Dagster 的矩阵);运行日志查看 ✅ | 不适用 |
| 资产 | 查看、搜索、健康状态、解析选择语法,以及物化指定资产(resolve_asset_selection → materialize_assets,支持运行配置和分区范围) | 查看 ✅ 和 Insights 指标 ✅;创建/启动、更新和删除均标记为 ❌——即没有资产级物化工具,但支持启动运行 | 不适用 |
| 计划和传感器 | 列出、查看触发历史、启动/停止 | 目前不支持 — Dagster 已确认,并预计会添加此功能 | 不适用 |
| 回填和分区 | 列出回填、启动分区作业、按分区范围回填资产 | Dagster 的功能矩阵中未列出 | 不适用 |
| 代码位置和实例健康状态 | 列出/重新加载代码位置、实例状态、守护进程心跳、排队运行数量 | 部署查看 ✅ 和 Insights ✅;未列出代码位置和守护进程健康状态(Dagster+ 会管理守护进程) | 不适用 |
| 告警、Insights、Dagster+ Issues | 不支持 — 没有告警、成本/Insights 指标或 Issues 等效功能 | 告警策略和 Dagster+ Issues:查看 / 创建 / 更新 / 删除均为 ✅。运行、资产和部署均支持 Insights 指标 ✅。这三项都是有文档说明的 Dagster+ 功能(Issues 处于有限早期访问阶段) | 不适用 |
| 多个实例 | 是 — DAGSTER_ENVS 将名称映射到任意 URL 和令牌,并提供每个工具专用的 env 参数;可混用 OSS 和 Dagster+ | 一个 Dagster+ 组织内的部署,可在每次工具调用时选择 | 不适用 |
| 写入安全性 | 始终注册 17 个只读工具;仅当 DAGSTER_READ_ONLY=false(默认值为 true)时才会注册 10 个写入工具,否则客户端甚至无法看到这些工具。这是一种便利性的防护措施,不是安全边界:它是一个在导入时读取的进程级环境变量,而你配置的 API 令牌仍保留其自身的全部权限 | 由 Dagster+ 在服务器端根据令牌权限强制执行。文档默认使用个人用户令牌;也提供服务用户作为范围受限的非人工身份验证替代方案(服务用户是 Dagster+ Pro 功能) | 不适用 |
| 支持 | 尽力提供支持,由社区维护,通过 GitHub 问题跟踪;没有 SECURITY.md 或有文档说明的披露流程 | 厂商官方支持 | 厂商官方支持 |
| 如果你在使用 Dagster+,且希望通过 Agent 获取告警、Issues 或 Insights/成本分析,不想使用本地运行时,或者需要厂商支持以及采购流程认可的供应商,请使用官方 Dagster+ MCP 服务。 |
如果你运行的是开源版或可自托管的 Dagster,或者需要通过 Agent 执行资产级物化、计划/传感器控制、回填,或代码位置和守护进程操作,请使用本项目。
对于 Dagster+ 用户,两者是互补而非竞争关系——你完全可以同时运行它们。本项目与 Dagster Labs 无关联,也未获得其认可。
兼容性
监控工具和现有操作工具已通过 Dagster 1.6+ 测试。
resolve_asset_selection 和 materialize_assets 需要 Dagster 1.9+,并且会在查询或启动前验证所需的 GraphQL 功能。RunsFilter 字段名称(jobName 与 pipelineName)会通过架构自省自动检测。配置的资产回填也会检测 LaunchBackfillParams.runConfigData 是否存在;如果较旧的架构未公开该字段,则会返回明确的兼容性错误。计划和传感器的启动/停止适用于 Dagster 1.6+:停止 mutation 使用 originId/selectorId 参数对,其值来自 InstigationState.id/selectorId;现代 Dagster 会将其重新解析为复合 ID,而较旧版本可直接接受,因此无需按版本分支处理。mutation 通过 ... on Error 接口片段选择错误消息,而非使用按类型划分的片段,因为 ScheduleNotFoundError 直到 Dagster 1.9 才加入 ScheduleMutationResult;若在 1.6-1.8 中展开该片段,会导致文档验证失败。
开发
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 locally
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。