{"id":26570869,"url":"https://github.com/yangkyeongmo/mcp-server-apache-airflow","last_synced_at":"2026-04-02T02:22:03.661Z","repository":{"id":277278513,"uuid":"931916510","full_name":"yangkyeongmo/mcp-server-apache-airflow","owner":"yangkyeongmo","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-03T13:24:59.000Z","size":186,"stargazers_count":142,"open_issues_count":11,"forks_count":43,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-03-03T15:50:31.542Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://pypi.org/project/mcp-server-apache-airflow/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yangkyeongmo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-13T04:09:06.000Z","updated_at":"2026-03-03T12:17:55.000Z","dependencies_parsed_at":"2025-02-13T05:12:25.017Z","dependency_job_id":"61f39d5b-0911-4fdf-aa57-fff13a9da3e4","html_url":"https://github.com/yangkyeongmo/mcp-server-apache-airflow","commit_stats":null,"previous_names":["yangkyeongmo/mcp-server-apache-airflow"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/yangkyeongmo/mcp-server-apache-airflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangkyeongmo%2Fmcp-server-apache-airflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangkyeongmo%2Fmcp-server-apache-airflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangkyeongmo%2Fmcp-server-apache-airflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangkyeongmo%2Fmcp-server-apache-airflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yangkyeongmo","download_url":"https://codeload.github.com/yangkyeongmo/mcp-server-apache-airflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yangkyeongmo%2Fmcp-server-apache-airflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31294527,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T01:43:37.129Z","status":"online","status_checked_at":"2026-04-02T02:00:08.535Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-22T22:19:19.543Z","updated_at":"2026-04-02T02:22:03.652Z","avatar_url":"https://github.com/yangkyeongmo.png","language":"Python","funding_links":[],"categories":["Developer Tools","Workflow \u0026 Automation Mcp Servers","Community Servers","🤖 AI/ML","پیاده‌سازی‌های سرور","Workflow Automation","Task and Project Management","Legend","MCP Servers","Servers","Data Platforms","🐳 Kubernetes \u0026 Containers","Uncategorized","Table of Contents","📚 Projects (2474 total)","Transformation \u0026 Orchestration","🗂️ Extensions by Category"],"sub_categories":["CI/CD \u0026 DevOps","💻 \u003ca name=\"developer-tools\"\u003e\u003c/a\u003eابزارهای توسعه‌دهنده","💻 \u003ca name=\"developer-tools\"\u003e\u003c/a\u003eDeveloper Tools","💻 Developer Tools","Data \u0026 Databases","How to Submit","Uncategorized","System Automation","MCP Servers","⚙️ Development Tools"],"readme":"[![MseeP.ai Security Assessment Badge](https://mseep.net/pr/yangkyeongmo-mcp-server-apache-airflow-badge.png)](https://mseep.ai/app/yangkyeongmo-mcp-server-apache-airflow)\n\n# mcp-server-apache-airflow\n\n[![smithery badge](https://smithery.ai/badge/@yangkyeongmo/mcp-server-apache-airflow)](https://smithery.ai/server/@yangkyeongmo/mcp-server-apache-airflow)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/mcp-server-apache-airflow)\n\nA Model Context Protocol (MCP) server implementation for Apache Airflow, enabling seamless integration with MCP clients. This project provides a standardized way to interact with Apache Airflow through the Model Context Protocol.\n\n\u003ca href=\"https://glama.ai/mcp/servers/e99b6vx9lw\"\u003e\n  \u003cimg width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/e99b6vx9lw/badge\" alt=\"Server for Apache Airflow MCP server\" /\u003e\n\u003c/a\u003e\n\n## About\n\nThis project implements a [Model Context Protocol](https://modelcontextprotocol.io/introduction) server that wraps Apache Airflow's REST API, allowing MCP clients to interact with Airflow in a standardized way. It uses the official Apache Airflow client library to ensure compatibility and maintainability.\n\n## Feature Implementation Status\n\n| Feature                          | API Path                                                                                      | Status |\n| -------------------------------- | --------------------------------------------------------------------------------------------- | ------ |\n| **DAG Management**         |                                                                                               |        |\n| List DAGs                        | `/api/v1/dags`                                                                              | ✅     |\n| Get DAG Details                  | `/api/v1/dags/{dag_id}`                                                                     | ✅     |\n| Pause DAG                        | `/api/v1/dags/{dag_id}`                                                                     | ✅     |\n| Unpause DAG                      | `/api/v1/dags/{dag_id}`                                                                     | ✅     |\n| Update DAG                       | `/api/v1/dags/{dag_id}`                                                                     | ✅     |\n| Delete DAG                       | `/api/v1/dags/{dag_id}`                                                                     | ✅     |\n| Get DAG Source                   | `/api/v1/dagSources/{file_token}`                                                           | ✅     |\n| Patch Multiple DAGs              | `/api/v1/dags`                                                                              | ✅     |\n| Reparse DAG File                 | `/api/v1/dagSources/{file_token}/reparse`                                                   | ✅     |\n| **DAG Runs**               |                                                                                               |        |\n| List DAG Runs                    | `/api/v1/dags/{dag_id}/dagRuns`                                                             | ✅     |\n| Create DAG Run                   | `/api/v1/dags/{dag_id}/dagRuns`                                                             | ✅     |\n| Get DAG Run Details              | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}`                                                | ✅     |\n| Update DAG Run                   | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}`                                                | ✅     |\n| Delete DAG Run                   | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}`                                                | ✅     |\n| Get DAG Runs Batch               | `/api/v1/dags/~/dagRuns/list`                                                               | ✅     |\n| Clear DAG Run                    | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/clear`                                          | ✅     |\n| Set DAG Run Note                 | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/setNote`                                        | ✅     |\n| Get Upstream Dataset Events      | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/upstreamDatasetEvents`                          | ✅     |\n| **Tasks**                  |                                                                                               |        |\n| List DAG Tasks                   | `/api/v1/dags/{dag_id}/tasks`                                                               | ✅     |\n| Get Task Details                 | `/api/v1/dags/{dag_id}/tasks/{task_id}`                                                     | ✅     |\n| Get Task Instance                | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}`                        | ✅     |\n| List Task Instances              | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances`                                  | ✅     |\n| Update Task Instance             | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}`                        | ✅     |\n| Get Task Instance Log            | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{task_try_number}` | ✅     |\n| Clear Task Instances             | `/api/v1/dags/{dag_id}/clearTaskInstances`                                                  | ✅     |\n| Set Task Instances State         | `/api/v1/dags/{dag_id}/updateTaskInstancesState`                                            | ✅     |\n| List Task Instance Tries         | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/tries`                  | ✅     |\n| **Variables**              |                                                                                               |        |\n| List Variables                   | `/api/v1/variables`                                                                         | ✅     |\n| Create Variable                  | `/api/v1/variables`                                                                         | ✅     |\n| Get Variable                     | `/api/v1/variables/{variable_key}`                                                          | ✅     |\n| Update Variable                  | `/api/v1/variables/{variable_key}`                                                          | ✅     |\n| Delete Variable                  | `/api/v1/variables/{variable_key}`                                                          | ✅     |\n| **Connections**            |                                                                                               |        |\n| List Connections                 | `/api/v1/connections`                                                                       | ✅     |\n| Create Connection                | `/api/v1/connections`                                                                       | ✅     |\n| Get Connection                   | `/api/v1/connections/{connection_id}`                                                       | ✅     |\n| Update Connection                | `/api/v1/connections/{connection_id}`                                                       | ✅     |\n| Delete Connection                | `/api/v1/connections/{connection_id}`                                                       | ✅     |\n| Test Connection                  | `/api/v1/connections/test`                                                                  | ✅     |\n| **Pools**                  |                                                                                               |        |\n| List Pools                       | `/api/v1/pools`                                                                             | ✅     |\n| Create Pool                      | `/api/v1/pools`                                                                             | ✅     |\n| Get Pool                         | `/api/v1/pools/{pool_name}`                                                                 | ✅     |\n| Update Pool                      | `/api/v1/pools/{pool_name}`                                                                 | ✅     |\n| Delete Pool                      | `/api/v1/pools/{pool_name}`                                                                 | ✅     |\n| **XComs**                  |                                                                                               |        |\n| List XComs                       | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries`            | ✅     |\n| Get XCom Entry                   | `/api/v1/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key}` | ✅     |\n| **Datasets**               |                                                                                               |        |\n| List Datasets                    | `/api/v1/datasets`                                                                          | ✅     |\n| Get Dataset                      | `/api/v1/datasets/{uri}`                                                                    | ✅     |\n| Get Dataset Events               | `/api/v1/datasetEvents`                                                                     | ✅     |\n| Create Dataset Event             | `/api/v1/datasetEvents`                                                                     | ✅     |\n| Get DAG Dataset Queued Event     | `/api/v1/dags/{dag_id}/dagRuns/queued/datasetEvents/{uri}`                                  | ✅     |\n| Get DAG Dataset Queued Events    | `/api/v1/dags/{dag_id}/dagRuns/queued/datasetEvents`                                        | ✅     |\n| Delete DAG Dataset Queued Event  | `/api/v1/dags/{dag_id}/dagRuns/queued/datasetEvents/{uri}`                                  | ✅     |\n| Delete DAG Dataset Queued Events | `/api/v1/dags/{dag_id}/dagRuns/queued/datasetEvents`                                        | ✅     |\n| Get Dataset Queued Events        | `/api/v1/datasets/{uri}/dagRuns/queued/datasetEvents`                                       | ✅     |\n| Delete Dataset Queued Events     | `/api/v1/datasets/{uri}/dagRuns/queued/datasetEvents`                                       | ✅     |\n| **Monitoring**             |                                                                                               |        |\n| Get Health                       | `/api/v1/health`                                                                            | ✅     |\n| **DAG Stats**              |                                                                                               |        |\n| Get DAG Stats                    | `/api/v1/dags/statistics`                                                                   | ✅     |\n| **Config**                 |                                                                                               |        |\n| Get Config                       | `/api/v1/config`                                                                            | ✅     |\n| **Plugins**                |                                                                                               |        |\n| Get Plugins                      | `/api/v1/plugins`                                                                           | ✅     |\n| **Providers**              |                                                                                               |        |\n| List Providers                   | `/api/v1/providers`                                                                         | ✅     |\n| **Event Logs**             |                                                                                               |        |\n| List Event Logs                  | `/api/v1/eventLogs`                                                                         | ✅     |\n| Get Event Log                    | `/api/v1/eventLogs/{event_log_id}`                                                          | ✅     |\n| **System**                 |                                                                                               |        |\n| Get Import Errors                | `/api/v1/importErrors`                                                                      | ✅     |\n| Get Import Error Details         | `/api/v1/importErrors/{import_error_id}`                                                    | ✅     |\n| Get Health Status                | `/api/v1/health`                                                                            | ✅     |\n| Get Version                      | `/api/v1/version`                                                                           | ✅     |\n\n## Setup\n\n### Dependencies\n\nThis project depends on the official Apache Airflow client library (`apache-airflow-client`). It will be automatically installed when you install this package.\n\n### Environment Variables\n\nSet the following environment variables:\n\n```\nAIRFLOW_HOST=\u003cyour-airflow-host\u003e        # Optional, defaults to http://localhost:8080\nAIRFLOW_API_VERSION=v1                  # Optional, defaults to v1\nREAD_ONLY=true                          # Optional, enables read-only mode (true/false, defaults to false)\n```\n\n#### Authentication\n\nChoose one of the following authentication methods:\n\n**Basic Authentication (default):**\n```\nAIRFLOW_USERNAME=\u003cyour-airflow-username\u003e\nAIRFLOW_PASSWORD=\u003cyour-airflow-password\u003e\n```\n\n**JWT Token Authentication:**\n```\nAIRFLOW_JWT_TOKEN=\u003cyour-jwt-token\u003e\n```\n\nTo obtain a JWT token, you can use Airflow's authentication endpoint:\n\n```bash\nENDPOINT_URL=\"http://localhost:8080\"  # Replace with your Airflow endpoint\ncurl -X 'POST' \\\n  \"${ENDPOINT_URL}/auth/token\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{ \"username\": \"\u003cyour-username\u003e\", \"password\": \"\u003cyour-password\u003e\" }'\n```\n\n\u003e **Note**: If both JWT token and basic authentication credentials are provided, JWT token takes precedence.\n\n### Usage with Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n**Basic Authentication:**\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-apache-airflow\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-apache-airflow\"],\n      \"env\": {\n        \"AIRFLOW_HOST\": \"https://your-airflow-host\",\n        \"AIRFLOW_USERNAME\": \"your-username\",\n        \"AIRFLOW_PASSWORD\": \"your-password\"\n      }\n    }\n  }\n}\n```\n\n**JWT Token Authentication:**\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-apache-airflow\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-apache-airflow\"],\n      \"env\": {\n        \"AIRFLOW_HOST\": \"https://your-airflow-host\",\n        \"AIRFLOW_JWT_TOKEN\": \"your-jwt-token\"\n      }\n    }\n  }\n}\n```\n\nFor read-only mode (recommended for safety):\n\n**Basic Authentication:**\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-apache-airflow\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-apache-airflow\"],\n      \"env\": {\n        \"AIRFLOW_HOST\": \"https://your-airflow-host\",\n        \"AIRFLOW_USERNAME\": \"your-username\",\n        \"AIRFLOW_PASSWORD\": \"your-password\",\n        \"READ_ONLY\": \"true\"\n      }\n    }\n  }\n}\n```\n\n**JWT Token Authentication:**\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-apache-airflow\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-apache-airflow\", \"--read-only\"],\n      \"env\": {\n        \"AIRFLOW_HOST\": \"https://your-airflow-host\",\n        \"AIRFLOW_JWT_TOKEN\": \"your-jwt-token\"\n      }\n    }\n  }\n}\n```\n\nAlternative configuration using `uv`:\n\n**Basic Authentication:**\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-apache-airflow\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"--directory\",\n        \"/path/to/mcp-server-apache-airflow\",\n        \"run\",\n        \"mcp-server-apache-airflow\"\n      ],\n      \"env\": {\n        \"AIRFLOW_HOST\": \"https://your-airflow-host\",\n        \"AIRFLOW_USERNAME\": \"your-username\",\n        \"AIRFLOW_PASSWORD\": \"your-password\"\n      }\n    }\n  }\n}\n```\n\n**JWT Token Authentication:**\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-apache-airflow\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"--directory\",\n        \"/path/to/mcp-server-apache-airflow\",\n        \"run\",\n        \"mcp-server-apache-airflow\"\n      ],\n      \"env\": {\n        \"AIRFLOW_HOST\": \"https://your-airflow-host\",\n        \"AIRFLOW_JWT_TOKEN\": \"your-jwt-token\"\n      }\n    }\n  }\n}\n```\n\nReplace `/path/to/mcp-server-apache-airflow` with the actual path where you've cloned the repository.\n\n### Selecting the API groups\n\nYou can select the API groups you want to use by setting the `--apis` flag.\n\n```bash\nuv run mcp-server-apache-airflow --apis dag --apis dagrun\n```\n\nThe default is to use all APIs.\n\nAllowed values are:\n\n- config\n- connections\n- dag\n- dagrun\n- dagstats\n- dataset\n- eventlog\n- importerror\n- monitoring\n- plugin\n- pool\n- provider\n- taskinstance\n- variable\n- xcom\n\n### Read-Only Mode\n\nYou can run the server in read-only mode by using the `--read-only` flag or by setting the `READ_ONLY=true` environment variable. This will only expose tools that perform read operations (GET requests) and exclude any tools that create, update, or delete resources.\n\nUsing the command-line flag:\n```bash\nuv run mcp-server-apache-airflow --read-only\n```\n\nUsing the environment variable:\n```bash\nREAD_ONLY=true uv run mcp-server-apache-airflow\n```\n\nIn read-only mode, the server will only expose tools like:\n- Listing DAGs, DAG runs, tasks, variables, connections, etc.\n- Getting details of specific resources\n- Reading configurations and monitoring information\n- Testing connections (non-destructive)\n\nWrite operations like creating, updating, deleting DAGs, variables, connections, triggering DAG runs, etc. will not be available in read-only mode.\n\nYou can combine read-only mode with API group selection:\n\n```bash\nuv run mcp-server-apache-airflow --read-only --apis dag --apis variable\n```\n\n### Manual Execution\n\nYou can also run the server manually:\n\n```bash\nmake run\n```\n\n`make run` accepts following options:\n\nOptions:\n\n- `--port`: Port to listen on for SSE (default: 8000)\n- `--transport`: Transport type (stdio/sse/http, default: stdio)\n\nOr, you could run the sse server directly, which accepts same parameters:\n\n```bash\nmake run-sse\n```\n\nAlso, you could start service directly using `uv` like in the following command:\n\n```bash\nuv run src --transport http --port 8080\n```\n\n### Installing via Smithery\n\nTo install Apache Airflow MCP Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@yangkyeongmo/mcp-server-apache-airflow):\n\n```bash\nnpx -y @smithery/cli install @yangkyeongmo/mcp-server-apache-airflow --client claude\n```\n\n## Development\n\n### Setting up Development Environment\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/yangkyeongmo/mcp-server-apache-airflow.git\ncd mcp-server-apache-airflow\n```\n\n2. Install development dependencies:\n```bash\nuv sync --dev\n```\n\n3. Create a `.env` file for environment variables (optional for development):\n```bash\ntouch .env\n```\n\n\u003e **Note**: No environment variables are required for running tests. The `AIRFLOW_HOST` defaults to `http://localhost:8080` for development and testing purposes.\n\n### Running Tests\n\nThe project uses pytest for testing with the following commands available:\n\n```bash\n# Run all tests\nmake test\n```\n\n### Code Quality\n\n```bash\n# Run linting\nmake lint\n\n# Run code formatting\nmake format\n```\n\n### Continuous Integration\n\nThe project includes a GitHub Actions workflow (`.github/workflows/test.yml`) that automatically:\n\n- Runs tests on Python 3.10, 3.11, and 3.12\n- Executes linting checks using ruff\n- Runs on every push and pull request to `main` branch\n\nThe CI pipeline ensures code quality and compatibility across supported Python versions before any changes are merged.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\nThe package is deployed automatically to PyPI when project.version is updated in `pyproject.toml`.\nFollow semver for versioning.\n\nPlease include version update in the PR in order to apply the changes to core logic.\n\n## License\n\n[MIT License](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyangkyeongmo%2Fmcp-server-apache-airflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyangkyeongmo%2Fmcp-server-apache-airflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyangkyeongmo%2Fmcp-server-apache-airflow/lists"}