Skip to main content
Glama
README.md
---
title: MCP Airflow
kind: source_doc
area: engineering
project: mcp-airflow
collection: mcp-airflow
owner: maintainers
status: current
canonical: README.md
globalRef: qmd://mcp-airflow/README.md
reviewCadenceDays: 90
lastReviewedAt: 2026-09-28
sourceRefs:
  - pyproject.toml
related:
  - AGENTS.md
  - docs/fluxos-negocio.md
  - docs/arquitetura.md
  - docs/operacao.md
  - docs/index.md
supersedes: []
supersededBy: []
sensitivity: public
---
# mcp-airflow

MCP server that exposes Apache Airflow REST API operations as tools. Built with
the FastMCP API from the [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk).

This is an open-source package. The maintainers do not operate a public hosted
Airflow endpoint through this repository.

## Install

```bash
# Run directly with uvx (no install needed)
uvx mcp-airflow

# Or install with pip
pip install mcp-airflow
```

For development:

```bash
uv pip install -e ".[dev]"
# or with dependency groups
uv sync --group dev
```

## Configuration

Set these environment variables (or create a `.env` file from `.env.example`):

| Variable | Description | Example |
|----------|-------------|---------|
| `AIRFLOW_BASE_URL` | Airflow REST API base URL. Use `/api/v2` for Airflow 3.x or `/api/v1` for 2.x | `http://100.x.x.x:8080/api/v2` |
| `AIRFLOW_USERNAME` | Auth username (JWT on 3.x, basic auth on 2.x) | `admin` |
| `AIRFLOW_PASSWORD` | Auth password | |

### Authentication

The client picks the auth scheme automatically based on your Airflow version:

- **Airflow 3.x (JWT)** — a JWT token is obtained from the `/auth/token` endpoint
  using `AIRFLOW_USERNAME`/`AIRFLOW_PASSWORD`, sent as a `Bearer` token, and
  refreshed automatically. Point `AIRFLOW_BASE_URL` at `/api/v2`.
- **Airflow 2.x (basic auth)** — if the JWT flow is unavailable, the client falls
  back to HTTP basic auth with the same username/password. Point `AIRFLOW_BASE_URL`
  at `/api/v1`.

## Usage

Run the server:

```bash
mcp-airflow
```

Or add to your MCP client config (e.g., Claude Desktop):

```json
{
  "mcpServers": {
    "airflow": {
      "command": "mcp-airflow",
      "env": {
        "AIRFLOW_BASE_URL": "http://100.x.x.x:8080/api/v2",
        "AIRFLOW_USERNAME": "admin",
        "AIRFLOW_PASSWORD": "your-password"
      }
    }
  }
}
```

## Tools

| Tool | Description |
|------|-------------|
| `list_dags` | List all DAGs with paused/active status |
| `get_dag_runs_today` | Get all DAG runs from today with status |
| `get_dag_run_status` | Get the latest run status for a specific DAG |
| `trigger_dag_run` | Trigger a manual DAG run |
| `get_task_instances` | Get task instances for a specific DAG run |
| `check_failed_dags` | Check for failed DAGs in the last 24 hours |
| `check_scheduler_health` | Check scheduler heartbeat and metadatabase status |

## Tests

```bash
pytest
```

## Documentation

Start at [`docs/index.md`](docs/index.md) for the supported flows, architecture,
operational guidance, and security boundary.

Roadmap and delivery status live in GitHub Issues and pull requests.

## License

MIT

TDQS

A4.2/5.0

Scored across 7 tools

Disambiguation5/5

Every tool targets a distinct aspect of Airflow (failed DAGs, scheduler health, specific DAG run status, today's runs, task instances, DAG listing, manual trigger). No two tools overlap in purpose.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with lowercase and underscores (e.g., check_failed_dags, get_dag_run_status). No deviations or mixed conventions.

Tool Count5/5

7 tools is well-scoped for an Airflow monitoring/management server. It covers essential operations without being excessive or minimal.

Completeness4/5

Covers core monitoring (health, DAG run status, task instances) and triggering. Missing pause/unpause, DAG details, or run deletion, but these are secondary for typical agent workflows.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive