Skip to main content
Glama
MCP-Airflow-API

MCP-Airflow-API

by call518

MCP-Airflow-API

Use Claude, OpenWebUI, and other MCP clients to inspect and operate Apache Airflow through its REST API.

License: MIT PyPI Docker Pulls Release workflow

What is MCP-Airflow-API?

MCP-Airflow-API turns plain-language requests into Apache Airflow REST API calls. One server supports Airflow 2.x API v1 and Airflow 3.x API v2, selected with AIRFLOW_API_VERSION.

  • Inspect DAGs, DAG runs, task instances, pools, variables, connections, and cluster health.

  • Trigger, pause, and manage supported Airflow resources using the permissions of the configured Airflow account.

  • Use local stdio or Streamable HTTP transport.

  • Run with Claude Desktop, OpenWebUI, any MCP client, or the optional MCPO OpenAPI compatibility proxy.

Example requests:

Show the currently running DAGs.
List failed task instances from the last 24 hours.
Trigger the example_etl DAG with today's processing date.
Show assets updated by data_ingestion.  # Airflow 3.x only

More requests to try: see Example queries by area for DAGs, task instances, XComs, pools, variables, configuration, monitoring, assets, datasets, users, plugins, and providers.

Related MCP server: mcp-airflow

Quick Start

Choose one path. Both require an Airflow account and network access to its API. For a test cluster, see Airflow-Docker-Compose.

Option A: Claude Desktop with MCPB

  1. Download mcp-airflow-api-<version>.mcpb from the latest GitHub Release.

  2. In Claude Desktop, open Settings → Extensions → Advanced settings → Install Extension… and select the bundle.

  3. Choose API v1 for Airflow 2.x or v2 for Airflow 3.x, then enter the API base URL, user name, and password.

  4. Ask: Show the health of my Airflow cluster.

The base URL excludes the version suffix, for example http://localhost:8080/api. See the Claude Desktop guide for uvx, source, and remote alternatives.

Option B: OpenWebUI with Docker Compose

Requirements: Git, Docker with the Compose plugin, and a model provider for OpenWebUI whose model supports tool calling.

1. Configure

git clone https://github.com/call518/MCP-Airflow-API.git
cd MCP-Airflow-API
cp .env.example .env
cp mcp-config.json.http mcp-config.json.http.local
chmod 600 mcp-config.json.http.local
openssl rand -hex 32   # use the output as WEBUI_SECRET_KEY
vi .env                # set WEBUI_SECRET_KEY and the AIRFLOW_* values

2. Start

docker compose up -d
docker compose ps      # wait until mcp-server is healthy

The default stack exposes only localhost:

  • OpenWebUI: http://localhost:3002

  • MCP server: http://localhost:18002/mcp

  • Optional MCPO/OpenAPI proxy: http://localhost:8002

3. Connect a model provider

These steps apply to both the direct MCP connection and MCPO.

  1. Open http://localhost:3002 and create the administrator account.

  2. Under Settings → Admin → Connections, add an OpenAI connection with URL https://api.openai.com/v1, Auth Bearer with your OpenAI API key, and API Type set to Chat Completions, then save it. For another provider, see the OpenWebUI guide.

  3. The Quick Start calls tools through Chat Completions with model reasoning turned off, using this default already present in .env.example:

    DEFAULT_MODEL_PARAMS={"reasoning_effort":"none"}

    This value requires API Type: Chat Completions. With Responses, OpenWebUI still sends reasoning_effort, and every request fails with Unsupported parameter: 'reasoning_effort'. If the open-webui-data volume already exists, set the same value under Settings → Admin → Models → Model Defaults → Model Parameters because its saved database value takes precedence. To keep model reasoning through Responses instead, see the OpenWebUI guide.

4. Connect the MCP server

  1. Under Settings → Admin → Tools → Integrations → External Tool Servers, add a connection of type MCP (Streamable HTTP) with the internal Docker URL http://mcp-server:8000/mcp and authentication None. Do not use the host URL from inside the Docker network.

  2. In a new chat, enable the connection under Integrations → Tools and ask: Use mcp-airflow-api to show the Airflow cluster health.

MCPO is optional. OpenWebUI connects directly to MCP; MCPO exists for OpenAPI clients. Start without it using docker compose up -d mcp-server open-webui.

See the OpenWebUI guide for MCPO setup, authentication, OpenAI reasoning models, and troubleshooting.

Other installation methods

Method

Command or guide

PyPI with uvx

uvx --python 3.12 mcp-airflow-api

Claude Desktop JSON configuration

Claude Desktop guide

Local development

uv sync --frozen && uv run mcp-airflow-api

Streamable HTTP

uv run mcp-airflow-api --type streamable-http

OpenWebUI and MCPO

OpenWebUI guide

Configuration

Variable

Required

Description

AIRFLOW_API_VERSION

No

v1 for Airflow 2.x (default), v2 for Airflow 3.x

AIRFLOW_API_BASE_URL

Yes

API root without /v1 or /v2, such as http://localhost:8080/api

AIRFLOW_API_USERNAME

Yes

Airflow API user name

AIRFLOW_API_PASSWORD

Yes

Airflow API password

MCP_LOG_LEVEL

No

DEBUG, INFO, WARNING, ERROR, or CRITICAL

FASTMCP_TYPE

No

stdio (default) or streamable-http

FASTMCP_HOST

HTTP only

Bind address; defaults to 127.0.0.1

FASTMCP_PORT

HTTP only

Listen port; defaults to 8000

REMOTE_AUTH_ENABLE

HTTP only

Enable Bearer authentication

REMOTE_SECRET_KEY

When auth enabled

Bearer token shared with MCP clients

See Configuration and security for Docker port settings, authentication, and client examples.

Safety and security

  • The server can change Airflow state when the configured account permits it. Review tool calls and use a least-privilege Airflow account.

  • Keep .env and mcp-config.json.*.local files out of Git. Tracked examples contain placeholders only.

  • Compose binds HTTP ports to 127.0.0.1 by default. Before exposing the MCP server remotely, enable Bearer authentication and put it behind HTTPS.

  • MCPB runs locally over stdio and does not use the HTTP Bearer settings.

Compatibility

  • Python 3.12 or newer

  • Airflow 2.x through REST API v1

  • Airflow 3.x through REST API v2; asset tools are v2-only

  • Claude Desktop MCPB, generic stdio/Streamable HTTP MCP clients, OpenWebUI, and optional MCPO/OpenAPI clients

Exact endpoint availability still depends on the Airflow version and the configured account's permissions.

Documentation

Guide

Contents

Claude Desktop

MCPB, uvx, source, and remote connections

OpenWebUI

Model provider, direct MCP, optional MCPO, OpenAI API type and reasoning models, troubleshooting

Configuration and security

Environment variables, ports, Bearer authentication

Usage guide

Example queries by area

API coverage

Detailed tool and Airflow endpoint coverage

Development

uv sync --frozen
uv run pytest -ra

Run locally over stdio:

AIRFLOW_API_VERSION=v1 \
AIRFLOW_API_BASE_URL=http://localhost:8080/api \
AIRFLOW_API_USERNAME=airflow \
AIRFLOW_API_PASSWORD=airflow \
uv run mcp-airflow-api

Build an MCPB without including local configuration or credentials:

scripts/build-mcpb.sh 0.0.0 /tmp/mcp-airflow-api-mcpb-check
unzip -l /tmp/mcp-airflow-api-mcpb-check/mcp-airflow-api-0.0.0.mcpb

License

MIT

Available Tools

53 tools
all_dag_event_summaryB

[Tool Role]: Provides summary of event logs across all DAGs.

Inputs: no named parameters. Returns: object

all_dag_import_summaryA

[Tool Role]: Provides summary of import errors across all DAGs.

Inputs: no named parameters. Returns: object

create_connectionC

[Tool Role]: Creates a new connection.

Inputs: connection_data (required). Returns: object

dag_calendarC

[Tool Role]: Shows DAG schedule and execution calendar for a date range.

Inputs: dag_id (required), end_date (required), start_date (required). Returns: object

dag_codeC

[Tool Role]: Retrieves the source code for the specified DAG.

Inputs: dag_id (required). Returns: object

dag_graphB

[Tool Role]: Retrieves task graph structure for the specified DAG.

Inputs: dag_id (required). Returns: object

dag_run_durationC

[Tool Role]: Analyzes DAG run durations and performance metrics.

Inputs: dag_id (required), limit. Returns: object

dag_task_durationC

[Tool Role]: Analyzes task durations within a DAG run.

Inputs: dag_id (required), dag_run_id. Returns: object

delete_connectionC

[Tool Role]: Deletes a connection.

Inputs: connection_id (required). Returns: object

failed_dagsB

[Tool Role]: Lists all recently failed DAG runs in the Airflow cluster.

Inputs: no named parameters. Returns: object

get_configC

[Tool Role]: Retrieves Airflow configuration.

Inputs: no named parameters. Returns: object

get_config_sectionB

[Tool Role]: Gets all options within a specific configuration section.

Inputs: section_name (required). Returns: object

get_connectionC

[Tool Role]: Gets details for a specific connection.

Inputs: connection_id (required). Returns: object

get_dagC

[Tool Role]: Retrieves detailed information for a specific DAG.

Inputs: dag_id (required). Returns: object

get_dags_detailed_batchB

[Tool Role]: Retrieves detailed information for multiple DAGs in batch with latest run information.

Inputs: limit, offset, fetch_all, is_active, +3 more. Returns: object

get_datasetB

[Tool Role]: Gets details of a specific dataset (v1 API only - v2 uses Assets).

Inputs: dataset_uri (required). Returns: object

get_dataset_eventsB

[Tool Role]: Gets events for a specific dataset (v1 API only - v2 uses Assets).

Inputs: dataset_uri (required), limit, offset. Returns: object

get_event_logB

[Tool Role]: Retrieves a specific event log entry.

Inputs: event_log_id (required). Returns: object

get_healthA

[Tool Role]: Checks Airflow cluster health status.

Inputs: no named parameters. Returns: object

get_import_errorB

[Tool Role]: Retrieves a specific import error.

Inputs: import_error_id (required). Returns: object

get_poolB

[Tool Role]: Gets details for a specific pool.

Inputs: pool_name (required). Returns: object

get_providerB

[Tool Role]: Gets details of a specific provider package.

Inputs: provider_name (required). Returns: object

get_task_instance_detailsC

[Tool Role]: Gets detailed information for a specific task instance.

Inputs: dag_id (required), task_id (required), dag_run_id (required). Returns: object

get_task_instance_logsC

[Tool Role]: Retrieves logs for a specific task instance.

Inputs: dag_id (required), task_id (required), dag_run_id (required), try_number. Returns: object

get_userC

[Tool Role]: Gets details of a specific user (v1 API only).

Inputs: username (required). Returns: object

get_variableB

[Tool Role]: Gets the value of a specific variable.

Inputs: variable_key (required). Returns: object

get_versionB

[Tool Role]: Gets Airflow version information.

Inputs: no named parameters. Returns: object

get_xcom_entryC

[Tool Role]: Gets a specific XCom entry.

Inputs: dag_id (required), task_id (required), xcom_key (required), dag_run_id (required). Returns: object

list_config_sectionsB

[Tool Role]: Lists all configuration sections with summary.

Inputs: no named parameters. Returns: object

list_connectionsC

[Tool Role]: Lists all connections in Airflow.

Inputs: limit, offset. Returns: object

list_dagsB

[Tool Role]: Lists all DAGs registered in the Airflow cluster with pagination support.

Inputs: limit, offset, fetch_all, id_contains, +1 more. Returns: object

list_dataset_eventsA

[Tool Role]: Lists dataset events for data lineage tracking (v1 API only - v2 uses Assets).

Inputs: limit, offset, dataset_uri, source_dag_id. Returns: object

list_datasetsB

[Tool Role]: Lists all datasets in the Airflow system (v1 API only - v2 uses Assets).

Inputs: limit, offset, uri_pattern. Returns: object

list_event_logsC

[Tool Role]: Lists event logs from Airflow.

Inputs: limit, dag_id, offset. Returns: object

list_import_errorsC

[Tool Role]: Lists import errors in Airflow.

Inputs: limit, offset. Returns: object

list_permissionsB

[Tool Role]: Lists all permissions available in the Airflow system (v1 API only).

Inputs: no named parameters. Returns: object

list_pluginsA

[Tool Role]: Lists all installed plugins in the Airflow system.

Inputs: no named parameters. Returns: object

list_poolsB

[Tool Role]: Lists all pools in Airflow.

Inputs: limit, offset. Returns: object

list_providersA

[Tool Role]: Lists all provider packages installed in the Airflow system.

Inputs: no named parameters. Returns: object

list_rolesB

[Tool Role]: Lists all roles in the Airflow system (v1 API only).

Inputs: limit, offset. Returns: object

list_task_instances_allC

[Tool Role]: Lists task instances with comprehensive filtering options.

Inputs: pool, limit, state, dag_id, +11 more. Returns: object

list_task_instances_batchC

[Tool Role]: Lists task instances in batch with date and state filtering.

Inputs: limit, state, offset, start_date_gte, +1 more. Returns: object

list_tasksB

[Tool Role]: Lists all tasks within the specified DAG.

Inputs: dag_id (required). Returns: object

list_usersB

[Tool Role]: Lists all users in the Airflow system (v1 API only).

Inputs: limit, offset. Returns: object

list_variablesC

[Tool Role]: Lists all variables in Airflow.

Inputs: limit, offset. Returns: object

list_xcom_entriesC

[Tool Role]: Lists XCom entries for a specific task instance.

Inputs: dag_id (required), task_id (required), dag_run_id (required), limit, +1 more. Returns: object

pause_dagA

[Tool Role]: Pauses the specified Airflow DAG (prevents scheduling new runs).

Inputs: dag_id (required). Returns: object

running_dagsA

[Tool Role]: Lists all currently running DAG runs in the Airflow cluster.

Inputs: no named parameters. Returns: object

search_config_optionsC

[Tool Role]: Searches for configuration options matching a term.

Inputs: search_term (required). Returns: object

trigger_dagC

[Tool Role]: Triggers a new DAG run for a specified Airflow DAG.

Inputs: dag_id (required). Returns: object

unpause_dagB

[Tool Role]: Unpauses the specified Airflow DAG (allows scheduling new runs).

Inputs: dag_id (required). Returns: object

update_connectionC

[Tool Role]: Updates an existing connection.

Inputs: connection_id (required), connection_data (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 53 tools

    Disambiguation3/5

    Most tools map to a distinct resource+action, but several clusters overlap: list_task_instances_all vs list_task_instances_batch vs get_task_instance_details, list_event_logs/get_event_log/all_dag_event_summary, and list_datasets/get_dataset_events/list_dataset_events (the last two read as near-duplicates). list_dags vs get_dags_detailed_batch vs get_dag is also a subtle distinction an agent could easily misfire on.

    Naming Consistency3/5

    The dominant pattern is snake_case verb_noun (list_pools, get_pool, create_connection), which is good. However, a sizeable minority break the verb-first rule: running_dags, failed_dags, dag_graph, dag_code, dag_calendar, all_dag_event_summary, all_dag_import_summary. The mixed conventions are still readable but not predictable.

    Tool Count2/5

    53 tools is far past the comfortable range for an agent to select from reliably, and Airflow's breadth doesn't fully excuse it. Many families (config, event logs, import errors, dataset events) could be collapsed into fewer parameterized tools, e.g. one list_task_instances with filters instead of two plus a batch variant.

    Completeness2/5

    Coverage is lopsided: connections get full CRUD, but variables, pools, users, roles, and datasets are read-only, and there is no way to clear/delete a DAG run, mark a task instance success/failed, or create/delete a DAG. Common operational recovery workflows (clear and rerun, set variable) are dead ends for an agent.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      F
      maintenance
      An MCP server that enables AI assistants to interact with Apache Airflow's REST API for DAG management, task monitoring, and system diagnostics. It provides comprehensive tools for triggering workflows, retrieving logs, and inspecting system health across Airflow 2.x and 3.x versions.
      31
      13
      Apache 2.0
    • A
      license
      A
      quality
      C
      maintenance
      An MCP server that enables AI coding assistants to interact with a local Airflow cluster via its REST API for triggering DAG runs, monitoring status, reading logs, and diagnosing errors.
      10
      27 PyPI
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server for controlling Apache Airflow 3 via its REST API, enabling operations like DAG management, task monitoring, and more through natural language.
      MIT