Incident Response MCP for Apache Airflow について
Incident Response MCP for Apache Airflowは、MCPクライアントをAirflow環境に接続し、失敗したDAG実行を調査します。UIリンクを解析し、フィルター処理とサイズ制限を施したタスクログを返し、書き込みツールの有効時には復旧操作も行えます。
主な機能
- 01Airflow UIリンクから実行・タスクIDを解決
- 02DAG実行とタスク試行を確認
- 03タスクログをフィルターしてサイズ制限
- 04複数のAirflowインスタンスを設定
- 05安全制御付きの復旧操作
- 06Airflow 2と3のAPI系列に対応
活用シーン
- 01アラートリンクから失敗したDAGを調査
- 02実行をクリアする前にタスクエラーを確認
- 03設定済みインスタンスのデプロイを調査
- 04書き込み権限でDAGを実行または一時停止
MCP 対応
このMCPサーバーは、Airflowの検出、読み取り、任意の書き込みツールをMCPクライアントに提供します。読み取り専用モードでは書き込みツールを登録せず、有効化した復旧ツールには破壊的操作の注釈が付きます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの 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 Registry で公開されています。 再現可能なスキャンレポート、依存関係の監査結果、SBOM、来歴情報は、各不変リリースに添付されています。
Claude、Cursor、VS Code、またはその他のMCPクライアントを Apache Airflow のデプロイ環境に接続し、エージェントによる DAG の失敗原因の診断を支援できます。
PagerDuty/Datadog のアラートから Airflow UI のリンクを貼り付けて、「なぜ失敗したのか」と尋ねてみてください。エージェントは URL を解決し、失敗したタスクを特定して、MCP の応答前にフィルタリングとサイズ制限を適用したログエラーを取得し、実行の再トリガーやクリアも行えます。書き込みツールには破壊的操作を示す注釈が付与されており、MCP クライアントから確認を求める際に利用できます。
主な特長
- 🔍 インシデント対応を最優先 — Airflow UI の URL から失敗したタスクを直接特定し、コンテキスト行を含めてエラーレベルでログをフィルタリングし、
try_numberのセマンティクスを正しく扱います(センサーを含む) - 🏢 複数インスタンス対応 — 同じ API ファミリーの開発/ステージング/本番環境を 1 つのサーバーで扱えます。インスタンスごとの認証情報に対応し、未知のホストを拒否する SSRF ガードを備えています
- 🔒 安全制御 — オプトインの読み取り専用モード(
AIRFLOW_MCP_READ_ONLY=true)では書き込みツールを登録しません。書き込みツールには破壊的操作の注釈が付与され、設定済みの認証情報はインスタンスの応答や操作ログから秘匿されます - 📉 トークン効率 — LLM のコンテキストウィンドウを考慮して、ログ末尾の取得、レベル別フィルタリング、バイト数の上限、切り詰め情報を設計しています
- 🧭 Airflow 2 と 3 に対応 — API v1/v2 アダプターを備え、JWT 認証を含めて Airflow 2.11 および 3.3 とのライブ E2E テストを実施しています
- 📎 追跡可能 — すべての応答に、構造化サーバーログと照合できる
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. エージェントに質問する
「
etl_pipelineの最新の実行が失敗したのはなぜですか?」「https://airflow.example.com/dags/etl_pipeline/grid — ここで何が起きたのでしょうか?クリアしても安全ですか?」
「失敗したタスクのエラーコンテキストを表示し、最小限の復旧アクションを教えてください。」
Airflow との互換性
このサーバーは、生成された apache-airflow-client を通じて Airflow と通信します。
Airflow 3 では、クライアントのリリースを Airflow のリリースに合わせてください。生成モデルはメジャーバージョン内でも変更される可能性があり、新しいクライアントが古いサーバーのレスポンスを正しくデシリアライズできるとは限りません。Airflow 2.11 では、Airflow 2 の安定版 API に対して、最後の v1 クライアントリリースである 2.10.0 を使用します。
| お使いの Airflow | REST API | インストール | ライブ E2E ステータス |
|---|---|---|---|
| 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:)を明示的に設定してください。
現在、1 つのサーバープロセスで読み込める生成クライアントは 1 つのメジャーバージョンのみです。そのため、レジストリ内のすべてのインスタンスで同じ API ファミリーを使用する必要があります。Airflow 2 と Airflow 3 には、別々の MCP サーバープロセスを実行してください。混在バージョンのサポートには今後のクライアントアダプターの変更が必要で、現時点では動作するものとして案内していません。
Airflow 3 に関する注意事項:
- 認証:ベアラートークンは 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 | ✅* | Basic 認証の認証情報 |
AIRFLOW_MCP_TOKEN | ✅* | Bearer/JWT トークン(Basic 認証の代わりに使用) |
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:Basic 認証を使用するインスタンスの 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 | 一時停止状態と UI リンクを含む DAG |
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 | 任意の conf/論理日付/メモを指定して実行をトリガーします |
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 が発生します。
インシデント対応ワークフロー
このツールの設計で想定しているフローです。アラートリンクから診断まで、4 回の呼び出しで進めます。
# 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、バイト数/行数の統計情報が含まれるため、エージェントは確認対象を正確に把握できます。ホストごとに分割されたログは --- [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 ファミリーのレジストリ YAML をマウントしてください。別個の v1 イメージが公開されるまでは、Airflow 2 のデプロイには上記の固定済みローカルインストール方法を使用してください。
CI では、イメージにインストールされた Python 依存関係を正確に監査し、固定された Cisco MCP Scanner リリースの YARA アナライザーを使って、読み取り専用と書き込み可能の両方の MCP ツールサーフェスをスキャンします。スキャンが不完全な場合、または未トリアージの YARA 検出がある場合、セキュリティワークフローは失敗します。v1.0.1 以降、リリースアセットには機械可読なスキャンレポートが含まれ、リリースイメージのマニフェストには、より広範なパッケージ一覧を対象とする SBOM と来歴の証明が添付されます。これらは自動チェックであり、セキュリティ認証でも、デプロイ固有のレビューの代替でもありません。
FastMCP ツール
FastMCP 対応ツールがエントリーポイントとデプロイのデフォルト設定を自動検出できるよう、fastmcp.json が含まれています。
開発
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 を、コーディングエージェントにこのリポジトリを参照させる場合は AGENTS.md をご覧ください(その用途向けに書かれています)。
コントリビューション
Issue や PR を歓迎します。特に、次のような内容をお待ちしています。
- 実際の Airflow のインシデント対応ワークフローやバージョンの組み合わせに関する報告
- ログの範囲制限、診断の安全性、URL を優先するワークフローの改善
- より多くの MCP ホストやデプロイの種類に対応するクライアント設定手順
このサーバーによってデバッグに費やす時間を減らせたなら、⭐ を付けていただくと、他の Airflow チームにも見つけてもらいやすくなります。
ライセンス
Apache 2.0 — LICENSE を参照してください。
Apache Airflow および Airflow は、The Apache Software Foundation の登録商標です。この独立したプロジェクトは ASF と提携しておらず、ASF の承認も受けていません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。