关于 Incident Response MCP for Apache Airflow
Incident Response MCP for Apache Airflow 将 MCP 客户端连接到 Airflow 部署,用于调查失败的 DAG 运行。它解析 UI 链接、返回经过筛选和限量的任务日志,并可在启用写工具时执行恢复操作。
主要功能
- 01将 Airflow UI 链接解析为运行和任务 ID
- 02查看 DAG 运行与任务尝试
- 03筛选并限制任务日志
- 04配置多个 Airflow 实例
- 05提供带安全控制的恢复操作
- 06支持 Airflow 2 和 3 API 系列
适用场景
- 01通过告警链接调查失败的 DAG
- 02清除运行前查看任务错误
- 03检查已配置实例中的部署
- 04获得写入权限后触发或暂停 DAG
MCP 相关
该 MCP 服务向 MCP 客户端提供 Airflow 发现、读取及可选写入工具。只读模式不注册写入工具;启用的恢复工具带有破坏性操作标注。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx apache-airflow-mcp-serverAIRFLOW_MCP_HOSTBase URL of the Airflow instance.AIRFLOW_MCP_TOKEN密钥Bearer token. Provide this or both username and password; it takes precedence when set.AIRFLOW_MCP_USERNAMEBasic-auth username. Required with password when token is omitted.AIRFLOW_MCP_PASSWORD密钥Basic-auth password. Required with username when token is omitted.AIRFLOW_MCP_API_VERSIONThe directory install uses the Airflow 3 client. See the README for Airflow 2 setup.AIRFLOW_MCP_READ_ONLYExpose only read tools unless write access is deliberately selected.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
16收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
Apache Airflow MCP 服务
独立的社区项目;与 Apache Software Foundation 无关联,也未获其认可。
通过 PyPI、 GHCR 和官方 MCP 注册表发布。 每个不可变版本均附有可复现的扫描报告、依赖审计、SBOM 和来源证明。
将 Claude、Cursor、VS Code 或其他 MCP 客户端连接到 Apache Airflow 部署,帮助 Agent 诊断失败的 DAG。
粘贴来自 PagerDuty/Datadog 告警的 Airflow UI 链接,然后询问 “为什么失败了?”——Agent 会解析 URL、查找失败的任务、提取经过筛选并限制在 MCP 响应范围内的日志错误,还能重新触发或清除运行。写入工具带有破坏性操作注解,MCP 客户端可据此请求确认。
亮点
- 🔍 以事件响应为先 — 直接从 Airflow UI URL 定位失败任务,按错误级别筛选日志并提供上下文行,正确遵循
try_number语义(包括传感器) - 🏢 多实例 — 一台服务可连接同一 API 系列的开发/预发布/生产环境目标,支持每个实例使用不同凭据,并配备拒绝未知主机的 SSRF 防护
- 🔒 安全控制 — 可选择启用只读模式(
AIRFLOW_MCP_READ_ONLY=true),此模式绝不注册写入工具;写入工具标注为破坏性操作;实例响应和操作日志中会遮蔽已配置的凭据 - 📉 节省令牌 — 日志尾部读取、级别筛选、字节数上限和截断元数据,专为大模型上下文窗口设计
- 🧭 Airflow 2 和 3 — 提供 API v1/v2 适配器,并针对 Airflow 2.11 和 3.3 进行实时 E2E 测试,包括 JWT 身份验证
- 📎 可追踪 — 每个响应都包含一个与结构化服务日志对应的
request_id
快速开始
1. 安装
uv tool install apache-airflow-mcp-server \
--with 'apache-airflow-client==3.3.0' # replace 3.3.0 with your Airflow version
使用 Airflow 2.11? 请改用
--with 'apache-airflow-client==2.10.0';2.10.0 是最后一个生成的 v1 客户端,面向 Airflow 2 的稳定 API。使用其他版本前,请参阅 Airflow 兼容性。
2. 连接 MCP 客户端
最快的方式是使用环境变量配置单个实例——无需配置文件。
Claude Code
claude mcp add airflow \
--env AIRFLOW_MCP_HOST=https://airflow.example.com \
--env AIRFLOW_MCP_USERNAME=admin \
--env AIRFLOW_MCP_PASSWORD=your-password \
--env AIRFLOW_MCP_READ_ONLY=true \
-- uvx --from apache-airflow-mcp-server \
--with apache-airflow-client==3.3.0 airflow-mcp --transport stdio
Claude Desktop
添加到 claude_desktop_config.json(Settings → Developer → Edit Config):
{
"mcpServers": {
"airflow": {
"command": "uvx",
"args": ["--from", "apache-airflow-mcp-server", "--with", "apache-airflow-client==3.3.0", "airflow-mcp", "--transport", "stdio"],
"env": {
"AIRFLOW_MCP_HOST": "https://airflow.example.com",
"AIRFLOW_MCP_USERNAME": "admin",
"AIRFLOW_MCP_PASSWORD": "your-password",
"AIRFLOW_MCP_READ_ONLY": "true"
}
}
}
}
Cursor
添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"airflow": {
"command": "uvx",
"args": ["--from", "apache-airflow-mcp-server", "--with", "apache-airflow-client==3.3.0", "airflow-mcp", "--transport", "stdio"],
"env": {
"AIRFLOW_MCP_HOST": "https://airflow.example.com",
"AIRFLOW_MCP_USERNAME": "admin",
"AIRFLOW_MCP_PASSWORD": "your-password",
"AIRFLOW_MCP_READ_ONLY": "true"
}
}
}
}
VS Code (Copilot)
添加到 .vscode/mcp.json:
{
"servers": {
"airflow": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "apache-airflow-mcp-server", "--with", "apache-airflow-client==3.3.0", "airflow-mcp", "--transport", "stdio"],
"env": {
"AIRFLOW_MCP_HOST": "https://airflow.example.com",
"AIRFLOW_MCP_USERNAME": "admin",
"AIRFLOW_MCP_PASSWORD": "your-password",
"AIRFLOW_MCP_READ_ONLY": "true"
}
}
}
}
任何客户端,通过 HTTP
自行运行服务,并将客户端指向该端点:
AIRFLOW_MCP_HOST=https://airflow.example.com \
AIRFLOW_MCP_USERNAME=admin AIRFLOW_MCP_PASSWORD=your-password \
AIRFLOW_MCP_READ_ONLY=true \
airflow-mcp --transport http --host 127.0.0.1 --port 8765
{ "mcpServers": { "airflow": { "url": "http://127.0.0.1:8765/mcp" } } }
健康检查:GET /health → 200 OK。
3. 向你的 Agent 提问
"
etl_pipeline最近一次运行为什么失败了?""https://airflow.example.com/dags/etl_pipeline/grid — 这里发生了什么?清除它安全吗?"
"显示失败任务的错误上下文,并告诉我最小的恢复操作。"
Airflow 兼容性
该服务通过生成的 apache-airflow-client 与 Airflow 通信。
对于 Airflow 3,请让客户端版本与 Airflow 版本匹配:生成的模型在同一主版本内也可能变化,较新的客户端不一定能正确反序列化较旧服务的响应。Airflow 2.11 使用最终版 v1 客户端 2.10.0,通过 Airflow 2 的稳定 API 通信。
| 你的 Airflow | REST API | 安装 | 实时端到端测试状态 |
|---|---|---|---|
| 3.3 | v2 | uv tool install apache-airflow-mcp-server --with 'apache-airflow-client==3.3.0' | ✅ 3.3.0 |
| 2.11 | v1 | uv tool install apache-airflow-mcp-server --with 'apache-airflow-client==2.10.0' | ✅ Airflow 2.11 + 最终版 v1 客户端 2.10.0 |
| 3.0–3.2 | v2 | 将客户端版本固定为已部署的 Airflow 3 版本 | 🧪 不在当前实时测试矩阵中 |
| 2.5–2.10 | v1 | 使用最终版 v1 客户端 apache-airflow-client==2.10.0 | 🧪 不在当前实时测试矩阵中 |
如果未设置 api_version,服务会假定使用与已安装客户端相匹配的 API(2.x 客户端使用 v1,3.x 客户端使用 v2)。请显式设置 AIRFLOW_MCP_API_VERSION(或在注册表中设置 api_version:),以便尽早发现主版本不匹配。
目前,单个服务进程只能加载一个生成的客户端主版本。因此,注册表中的所有实例都必须使用相同的 API 系列;请为 Airflow 2 和 Airflow 3 分别运行 MCP 服务进程。混合版本支持需要未来更改客户端适配器,目前尚未宣称可用。
Airflow 3 说明:
- 认证:Bearer 令牌会作为 JWT 直接传递;基本凭据会自动通过
POST /auth/token交换为 JWT,并定期刷新(AIRFLOW_MCP_TOKEN_REFRESH_SECONDS,默认值为 3600——请确保它小于部署环境中的 JWT 过期时间,并注意目前 401 响应不会触发自动重新认证)。 execution_date排序会映射到logical_date,数据集会映射到资产,UI 链接会使用 Airflow 3 的路由方案。工具名称和核心工作流保持稳定;文档中说明的字段和选项可能因 API 系列而异。- 对于 Airflow 3 中已不存在的清除选项(
include_subdags/include_parentdag,以及airflow_clear_dag_run的include_*/reset_dag_runs选项),服务会返回INVALID_INPUT,而不会默默缩小破坏性操作的范围。
我们会在相关的拉取请求和 main 推送中测试这两类客户端。非常欢迎提交来自真实 Airflow 部署环境的错误报告!
配置
单实例(仅环境变量)
| 变量 | 必填 | 描述 |
|---|---|---|
AIRFLOW_MCP_HOST | ✅ | Airflow 基础 URL,例如 https://airflow.example.com |
AIRFLOW_MCP_USERNAME / AIRFLOW_MCP_PASSWORD | ✅* | 基本身份验证凭据 |
AIRFLOW_MCP_TOKEN | ✅* | Bearer/JWT 令牌(用于替代基本身份验证) |
AIRFLOW_MCP_API_VERSION | v1(Airflow 2)或 v2(Airflow 3);默认使用与已安装的 apache-airflow-client 相匹配的版本 | |
AIRFLOW_MCP_VERIFY_SSL | 验证 TLS 证书(默认值为 true) |
* 提供用户名和密码,或令牌。
多实例(注册表 YAML)
将 AIRFLOW_MCP_INSTANCES_FILE 指向一个 YAML 注册表(其优先级高于单实例环境变量)。值可以通过 ${VAR} 引用环境变量:
data-stg:
host: https://airflow.data-stg.example.com/
api_version: v1 # Airflow 2
verify_ssl: true
auth:
type: basic
username: ${AIRFLOW_DATA_STG_USERNAME}
password: ${AIRFLOW_DATA_STG_PASSWORD}
data-prod:
host: https://airflow.data-prod.example.com/
api_version: v1 # Keep one client/API family per server process
auth:
type: bearer
token: ${AIRFLOW_DATA_PROD_TOKEN}
每个工具都接受 instance 键(data-stg)或 ui_url——一个完整的 http(s) Airflow UI URL,其主机将与注册表进行匹配;未知主机将被拒绝(SSRF 防护)。如果链接中包含 dag_id/dag_run_id/task_id,ui_url 也会自动填充这些字段。如果同时传入 instance 和 ui_url,但两者不一致,调用将以 INSTANCE_MISMATCH 失败,而不会猜测。
Kubernetes 提示: 将注册表从 Secret 挂载到 /config/instances.yaml,并设置 AIRFLOW_MCP_INSTANCES_FILE=/config/instances.yaml。
服务选项
| 变量 | 默认值 | 描述 |
|---|---|---|
AIRFLOW_MCP_DEFAULT_INSTANCE | 默认实例键(也用于命名环境变量实例) | |
AIRFLOW_MCP_READ_ONLY | false | 完全不注册写入工具 |
AIRFLOW_MCP_HTTP_HOST / AIRFLOW_MCP_HTTP_PORT | 127.0.0.1 / 8765 | HTTP 传输绑定地址 |
AIRFLOW_MCP_TIMEOUT_SECONDS | 30 | Airflow API 超时时间 |
AIRFLOW_MCP_TOKEN_REFRESH_SECONDS | 3600 | Airflow 3:基本身份验证实例的 JWT 刷新间隔 |
AIRFLOW_MCP_LOG_FILE | 可选的日志文件路径 | |
AIRFLOW_MCP_ENABLE_EXTENDED_CLEAR_PARAMS | false | 启用 include_* 清除参数(Airflow ≥2.6) |
AIRFLOW_MCP_HTTP_BLOCK_GET_ON_MCP | true | 在 HTTP 部署中,对 GET /mcp(SSE 读取)返回 405 |
只读模式
快速入门配置会设置 AIRFLOW_MCP_READ_ONLY=true:不会注册写入工具(触发、清除、暂停/取消暂停)。这可以防止 MCP 执行变更,但读取工具仍可能泄露敏感日志、配置、渲染后的字段和 DAG 运行数据;请使用遵循最小权限原则的 Airflow 凭据。
如需有意启用恢复操作,请设置 AIRFLOW_MCP_READ_ONLY=false。此时,写入工具会携带 MCP destructiveHint 注释,客户端可在决定是否请求确认时使用这些注释。注释仅供参考,因此只有在 Airflow 凭据和 MCP 客户端的审批行为适合目标环境时,才应启用写入操作。
工具
发现和 URL 实用工具
| 工具 | 描述 |
|---|---|
airflow_list_instances | 列出已配置的实例键和默认实例 |
airflow_describe_instance | 主机、API 版本、身份验证类型(机密信息已隐藏) |
airflow_resolve_url | 将 Airflow UI URL 解析为实例、DAG、运行和任务标识符 |
读取
| 工具 | 描述 |
|---|---|
airflow_list_dags | 列出 DAG,包含暂停状态和 UI 链接 |
airflow_get_dag | DAG 详情 |
airflow_list_dag_runs | 列出运行,支持状态筛选和排序(默认最新优先) |
airflow_get_dag_run | 单次运行详情 |
airflow_list_task_instances | 某次运行的任务尝试;在服务端按 state / task_ids 筛选 |
airflow_get_task_instance | 任务元数据、重试次数、计时信息,以及可选的渲染后模板字段 |
airflow_get_task_instance_logs | 日志,支持级别筛选、尾部读取、上下文行和字节数上限 |
airflow_dataset_events | 数据集(Airflow 2)/资产(Airflow 3)事件 |
写入(标注为具有破坏性,因此客户端可以要求审批;在只读模式下完全隐藏)
| 工具 | 描述 |
|---|---|
airflow_trigger_dag | 触发一次运行,可选配置、逻辑日期和备注 |
airflow_clear_task_instances | 清除多个运行中的任务实例(默认 dry_run=true) |
airflow_clear_dag_run | 清除整个运行(默认 dry_run=true) |
airflow_pause_dag / airflow_unpause_dag | 切换 DAG 调度状态 |
每个成功载荷都包含用于关联日志的 request_id;失败时会抛出包含 {code, message, request_id, context} 的结构化 ToolError。
事故处理工作流
这些工具正是围绕这一流程设计的——通过四次调用,从告警链接找到诊断结果:
# 1. Alert contains an Airflow UI link → resolve it
airflow_resolve_url("https://airflow.example.com/dags/etl_pipeline/grid?dag_run_id=...")
# → {instance, dag_id, dag_run_id, ...}
# 2. Which tasks failed in this run?
airflow_list_task_instances(dag_id="etl_pipeline", dag_run_id="scheduled__2026-01-01",
state=["failed"])
# 3. Get attempt metadata (authoritative try_number, retries, timings)
ti = airflow_get_task_instance(dag_id="etl_pipeline",
dag_run_id="scheduled__2026-01-01",
task_id="transform_data")
# 4. Pull only the error lines, with context, capped for the LLM
airflow_get_task_instance_logs(dag_id="etl_pipeline",
dag_run_id="scheduled__2026-01-01",
task_id="transform_data",
try_number=ti["attempts"]["try_number"],
tail_lines=500, filter_level="error", context_lines=5)
日志响应包含 truncated、auto_tailed(超过 100 MB 的日志会自动读取尾部)、match_count 以及字节数/行数统计,因此 Agent 能准确了解自己查看的内容。按主机分段的日志会使用 --- [worker-1] --- 标头合并;Airflow 3 结构化日志则会渲染为纯文本行。
关于
try_number的说明: 在 Airflow 2.9 中,重新调度模式的传感器可能会在每次重新调度时递增该值;Airflow 2.10 及更高版本不再如此。请始终从airflow_get_task_instance读取该值,不要猜测——派生字段retries_consumed/retries_remaining只是启发式估算。
部署
Docker
docker run -p 127.0.0.1:8765:8765 \
-e AIRFLOW_MCP_HOST=https://airflow.example.com \
-e AIRFLOW_MCP_USERNAME=admin \
-e AIRFLOW_MCP_PASSWORD=your-password \
-e AIRFLOW_MCP_READ_ONLY=true \
ghcr.io/madamak/apache-airflow-mcp-server:latest
或者,在本地使用 docker build -t airflow-mcp . 构建
发布镜像包含锁文件指定的 Airflow 3.3 客户端,并在 :8765 上提供可流式传输的 HTTP 服务(/mcp 端点,/health 用于探测)。MCP HTTP 端点没有内置调用方身份验证:请仅绑定到环回地址,或将其置于经过身份验证的私有代理后方。对于多实例部署,请挂载属于同一 API 系列的 registry YAML。在发布单独的 v1 镜像之前,Airflow 2 部署应使用上述固定版本的本地安装路径。
CI 会审计精确镜像中安装的 Python 依赖项,并使用固定版本的 Cisco MCP Scanner 发布版中的 YARA 分析器扫描只读和启用写入的 MCP 工具表面。若扫描不完整或存在任何尚未分类的 YARA 发现,安全工作流就会失败。从 v1.0.1 开始,发布资源包含机器可读的扫描报告,发布镜像清单则附带涵盖更广泛软件包清单的 SBOM 和来源证明。这些是自动化检查,并非安全认证,也不能替代针对具体部署的审查。
FastMCP 工具
此处包含 fastmcp.json,方便支持 FastMCP 的工具自动发现入口点和部署默认值。
开发
uv sync # install dependencies
uv run pytest # unit tests (no real network; the Airflow client is mocked)
uv run ruff check . # lint
uv run ruff format . # format
uv run airflow-mcp --transport stdio # run locally
./scripts/e2e.sh af2 # end-to-end against Airflow 2.11
./scripts/e2e.sh af3 # end-to-end against Airflow 3.3
# Both seed failures/noisy logs and drive every tool
# through MCP. Set E2E_KEEP=1 to keep the instance up.
CI 会在 Python 3.10–3.13 上,针对 apache-airflow-client 的两个系列运行单元测试套件。相关拉取请求、推送到 main、每夜运行和发布还会使用 Docker 化的 Airflow 2.11 和 3.3 进行实时测试。指南请参阅 CONTRIBUTING.md;如果要让编码 Agent 使用此代码库,请参阅 AGENTS.md(该文件就是为此编写的)。
贡献
欢迎提交问题和 PR,尤其是:
- 真实 Airflow 事故响应工作流和版本组合的报告
- 对有限日志、安全诊断和优先使用 URL 的工作流的改进
- 更多 MCP 主机和部署类型的客户端配置指南
如果这个服务帮你省下了一次调试,点个 ⭐ 就能帮助其他 Airflow 团队找到它。
许可证
Apache 2.0——请参阅 LICENSE。
Apache Airflow 和 Airflow 是 Apache 软件基金会的注册商标。本独立项目与 ASF 无关,也未获得 ASF 背书。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。