# AWX MCP - AI-Powered AWX/AAP/Ansible Automation **Industry-standard MCP server for AWX/AAP/Ansible Tower automation** The AWX MCP Server connects **AWX**, **Ansible Automation Platform (AAP)**, and **Ansible Tower** to AI tools, giving AI agents and assistants the ability to manage job templates, launch and monitor jobs, manage inventories and projects, and automate infrastructure workflows through natural language interactions. **Designed for developers who want to integrate their AI tools with AWX/AAP/Tower automation capabilities.** **✨ Supports AWX (open source), AAP (Red Hat), and Ansible Tower (legacy) - same API, same features!** --- ## 🎯 Usage Patterns ### Primary: MCP Server (Industry Standard) ⭐ RECOMMENDED MCP Server **Standard MCP implementation using STDIO transport (like Postman MCP, Claude MCP)** **Use Case**: AI assistants (GitHub Copilot, Claude, Cursor) + AWX automation **Features**: - βœ… Works with any MCP client (Copilot, Claude, Cursor, Windsurf, etc.) - βœ… Industry standard pattern (STDIO transport) - βœ… Simple installation: `pip install git+https://github.com/USERNAME/awx-mcp-server.git` - βœ… Portable across all MCP-compatible tools - βœ… 18+ AWX operations (templates, jobs, projects, inventories) **Best For**: AI-powered automation, natural language AWX control, any MCP client --- ### Optional: VS Code Extension (UI Enhancement) VS Code Extension **Optional UI features for VS Code users** **Use Case**: VS Code users who want additional UI (sidebar views, tree providers) **Features**: - βœ… Sidebar with AWX instances, jobs, metrics - βœ… Tree view of AWX resources - βœ… Configuration webview - βœ… Auto-configures MCP (or respects manual setup) **Best For**: VS Code users wanting rich UI alongside MCP functionality --- ## πŸš€ Quick Start ### Installation Methods You have **three ways** to install and run the AWX MCP Server: | Method | Best For | Installation | |--------|----------|--------------| | **πŸ“¦ PyPI (pip)** | Quick install, production use | `pip install awx-mcp-server` | | **πŸ”§ From Source** | Customization, development, enterprise forks | Clone from GitHub, edit code | | **🐳 Docker** | Containerized deployment, teams | `docker run surgexlabs/awx-mcp-server` | **β†’ For customization and running from your own repository, see [INSTALL_FROM_SOURCE.md](INSTALL_FROM_SOURCE.md)** --- ### Option 1: PyPI Installation (Recommended for Quick Start) #### Install from PyPI ```bash # Install the MCP server pip install awx-mcp-server # Verify installation python -m awx_mcp_server --version ``` #### Configure for VS Code **Edit VS Code settings.json** (`Ctrl+,` β†’ Search "chat.mcp"): ```json { "mcpServers": { "awx": { "command": "python", "args": ["-m", "awx_mcp_server"], "env": { "AWX_BASE_URL": "https://your-awx.com" }, "secrets": { "AWX_TOKEN": "your-awx-token" } } } } ``` **Restart VS Code** and the MCP server will be available in Copilot Chat. --- ### Option 2: Install from Source (For Customization) **Perfect for**: Forking, customization, enterprise deployments, contributing **Quick install**: ```bash # Clone the repository (or your fork) git clone https://github.com/SurgeX-Labs/awx-mcp-server.git cd awx-mcp-server/awx-mcp-python/server # Create virtual environment python -m venv venv source venv/bin/activate # Windows: .\venv\Scripts\Activate.ps1 # Install in editable mode pip install -e . # Verify python -m awx_mcp_server --version ``` **VS Code configuration** (use venv Python): ```json { "mcpServers": { "awx": { "command": "/path/to/awx-mcp-server/awx-mcp-python/server/venv/bin/python", "args": ["-m", "awx_mcp_server"], "env": { "AWX_BASE_URL": "https://your-awx.com" }, "secrets": { "AWX_TOKEN": "your-token" } } } } ``` **πŸ“– Full Guide**: See [INSTALL_FROM_SOURCE.md](INSTALL_FROM_SOURCE.md) for: - Forking the repository - Making customizations to the code - Running from your own fork/repository - Building custom Docker images from source - Enterprise deployment and CI/CD --- ### Option 3: Remote Server Mode (Team/Enterprise) #### Prerequisites - Python 3.10+ - AWX/Ansible Tower instance - (Optional) Docker or Kubernetes #### Quick Start with Docker ```bash cd awx-mcp-python/server # Start server with monitoring stack docker-compose up -d # Server available at: # - API: http://localhost:8000 # - Docs: http://localhost:8000/docs # - Metrics: http://localhost:8000/prometheus-metrics # - Prometheus: http://localhost:9090 # - Grafana: http://localhost:3000 ``` #### Quick Start with Python ```bash cd awx-mcp-python/server # Install pip install -e . # Configure AWX environment (interactive) awx-mcp-server env list # Start server awx-mcp-server start --host 0.0.0.0 --port 8000 ``` #### CLI Usage ```bash # List job templates awx-mcp-server templates list # Launch job awx-mcp-server jobs launch "Deploy App" --extra-vars '{"env":"prod"}' # Monitor job awx-mcp-server jobs get 123 awx-mcp-server jobs stdout 123 # Manage projects awx-mcp-server projects list awx-mcp-server projects update "My Project" # List inventories awx-mcp-server inventories list ``` #### REST API Usage ```bash # Create API key (first time) curl -X POST http://localhost:8000/api/keys \ -H "Content-Type: application/json" \ -d '{"name": "chatbot", "tenant_id": "team1", "expires_days": 90}' # List job templates curl http://localhost:8000/api/v1/job-templates \ -H "X-API-Key: awx_mcp_xxxxx" # Launch job curl -X POST http://localhost:8000/api/v1/jobs/launch \ -H "X-API-Key: awx_mcp_xxxxx" \ -H "Content-Type: application/json" \ -d '{"template_name": "Deploy App", "extra_vars": {"env": "prod"}}' # Get job status curl http://localhost:8000/api/v1/jobs/123 \ -H "X-API-Key: awx_mcp_xxxxx" # Get job output curl http://localhost:8000/api/v1/jobs/123/stdout \ -H "X-API-Key: awx_mcp_xxxxx" ``` #### Kubernetes Deployment ```bash cd server/deployment/helm helm install awx-mcp-server . \ --set replicaCount=3 \ --set autoscaling.enabled=true \ --set taskPods.enabled=true ``` **See**: [server/README.md](server/README.md) for detailed guide --- ## 🎨 Integration Examples ### Integrate with Custom Chatbot ```python import httpx class AWXChatbot: def __init__(self, api_key: str, base_url: str = "http://localhost:8000"): self.api_key = api_key self.base_url = base_url self.headers = {"X-API-Key": api_key} async def handle_message(self, user_message: str): """Process user message and call AWX API""" if "list templates" in user_message.lower(): return await self.list_templates() elif "launch" in user_message.lower(): template_name = self.extract_template_name(user_message) return await self.launch_job(template_name) elif "job status" in user_message.lower(): job_id = self.extract_job_id(user_message) return await self.get_job(job_id) async def list_templates(self): async with httpx.AsyncClient() as client: response = await client.get( f"{self.base_url}/api/v1/job-templates", headers=self.headers ) return response.json() async def launch_job(self, template_name: str, extra_vars: dict = None): async with httpx.AsyncClient() as client: response = await client.post( f"{self.base_url}/api/v1/jobs/launch", headers=self.headers, json={"template_name": template_name, "extra_vars": extra_vars} ) return response.json() async def get_job(self, job_id: int): async with httpx.AsyncClient() as client: response = await client.get( f"{self.base_url}/api/v1/jobs/{job_id}", headers=self.headers ) return response.json() # Usage chatbot = AWXChatbot(api_key="awx_mcp_xxxxx") response = await chatbot.handle_message("list all job templates") ``` ### Integrate with Slack Bot ```python from slack_bolt.async_app import AsyncApp import httpx app = AsyncApp(token="xoxb-your-token") awx_api_key = "awx_mcp_xxxxx" awx_base_url = "http://localhost:8000" @app.message("awx") async def handle_awx_command(message, say): text = message['text'] if "launch" in text: # Extract template name from message template = extract_template(text) # Call AWX API async with httpx.AsyncClient() as client: response = await client.post( f"{awx_base_url}/api/v1/jobs/launch", headers={"X-API-Key": awx_api_key}, json={"template_name": template} ) job = response.json() await say(f"βœ… Job launched! ID: {job['id']}, Status: {job['status']}") ``` --- ## πŸ”§ Available AWX Operations Both VS Code extension and web server support all 16 operations: ### Environment Management - `env_list` - List all configured AWX environments - `env_test` - Test connection to AWX environment - `env_get_active` - Get currently active environment ### Job Templates - `list_job_templates` - List all job templates (with filtering) - `get_job_template` - Get template details by name/ID ### Jobs - `list_jobs` - List all jobs (filter by status, date) - `get_job` - Get job details by ID - `job_launch` - Launch job from template - `job_cancel` - Cancel running job - `job_stdout` - Get job output/logs - `job_events` - Get job events (playbook tasks) ### Projects - `list_projects` - List all projects - `project_update` - Update project from SCM ### Inventories - `list_inventories` - List all inventories - `get_inventory` - Get inventory details --- ## πŸ“¦ Project Structure ``` awx-mcp-python/ β”œβ”€β”€ vscode-extension/ # VS Code extension with GitHub Copilot β”‚ β”œβ”€β”€ src/ # Extension TypeScript source β”‚ β”œβ”€β”€ package.json # Extension manifest β”‚ β”œβ”€β”€ README.md # Extension guide β”‚ └── CHANGELOG.md β”‚ β”‚ β”œβ”€β”€ server/ # Standalone web server β”‚ β”œβ”€β”€ src/awx_mcp_server/ β”‚ β”‚ β”œβ”€β”€ cli.py # CLI commands (468 lines) β”‚ β”‚ β”œβ”€β”€ http_server.py # FastAPI REST API β”‚ β”‚ β”œβ”€β”€ mcp_server.py # MCP server integration β”‚ β”‚ β”œβ”€β”€ monitoring.py # Prometheus metrics β”‚ β”‚ β”œβ”€β”€ task_pods.py # Kubernetes task pods β”‚ β”‚ β”œβ”€β”€ clients/ # AWX clients (self-contained) β”‚ β”‚ β”œβ”€β”€ storage/ # Config & credentials β”‚ β”‚ └── domain/ # Models & exceptions β”‚ β”œβ”€β”€ deployment/ β”‚ β”‚ β”œβ”€β”€ docker-compose.yml # Docker Compose stack β”‚ β”‚ β”œβ”€β”€ Dockerfile # Container image β”‚ β”‚ └── helm/ # Kubernetes Helm chart β”‚ β”œβ”€β”€ pyproject.toml β”‚ └── README.md β”‚ └── tests/ # Shared test suite β”œβ”€β”€ test_*.py └── conftest.py ``` --- ## πŸ—οΈ Architecture ### VS Code Extension Architecture ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ VS Code IDE β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ stdio β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ GitHub │──┼────transport───▢│ MCP Server β”‚ β”‚ β”‚ Copilot β”‚ β”‚ (local) β”‚ (shared) β”‚ β”‚ β”‚ Chat │◀─┼────────────────│ 16 Tools β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ @awx Chat β”‚ β”‚ β”‚ β”‚ β”‚Participantβ”‚ β”‚ β–Ό β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ AWX β”‚ β”‚ Instance β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Flow**: 1. User types `@awx list templates` in Copilot Chat 2. Extension sends MCP request to local server via stdio 3. MCP server calls AWX REST API 4. Results returned to Copilot Chat 5. AI formats response naturally ### Web Server Architecture ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” REST API β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Chatbot │────────────────────▢│ FastAPI β”‚ β”‚ /Custom App β”‚ (HTTP/JSON) β”‚ Server β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” REST API β”‚ β”‚ Slack Bot │────────────────────▢│ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” CLI β”‚ β”‚ Terminal │────────────────────▢│ β”‚ Scripts β”‚ (commands) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Clients β”‚ β”‚ REST + CLI β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ AWX β”‚ β”‚ Instance β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Flow**: 1. Client (chatbot/CLI) sends HTTP request with API key 2. FastAPI server authenticates request 3. Server calls AWX API via composite client 4. Results returned as JSON 5. Client formats for end user (Slack, terminal, etc.) --- ## πŸ”’ Security ### VS Code Extension - Credentials stored in VS Code secure storage - Local server only (no network exposure) - Environment-based isolation ### Web Server - API key authentication (SHA-256 hashed) - Multi-tenant isolation - Configurable key expiration - HTTPS recommended for production - Environment variables for secrets --- ## 🚒 Deployment Options ### For VS Code Extension - Install extension from .vsix file - MCP server runs automatically when VS Code starts - No additional infrastructure needed ### For Web Server #### Development ```bash cd server pip install -e . awx-mcp-server start ``` #### Production - Docker ```bash cd server docker-compose up -d ``` Includes: Server, Prometheus, Grafana #### Production - Kubernetes ```bash cd server/deployment/helm helm install awx-mcp-server . \ --set autoscaling.enabled=true \ --set taskPods.enabled=true \ --set ingress.enabled=true ``` Features: - Horizontal Pod Autoscaling (HPA) - Task pods (ephemeral Job per operation) - Prometheus monitoring - Ingress support --- ## πŸ› οΈ Development ### Prerequisites - Python 3.10+ - Node.js 18+ (for VS Code extension) - Docker (optional) - Kubernetes cluster (optional) ### Setup Development Environment ```bash # Clone repository git clone https://github.com/your-org/awx-mcp.git cd awx-mcp/awx-mcp-python # Install shared package (for VS Code extension) cd shared pip install -e ".[dev]" # Install server cd ../server pip install -e ".[dev]" # Install extension dependencies cd ../vscode-extension npm install # Run tests cd ../tests pytest -v ``` ### Running Tests ```bash # Server tests cd server pytest tests/ -v --cov # Integration tests cd tests pytest test_mcp_integration.py -v ``` ### Building VS Code Extension ```bash cd vscode-extension npm run package # Generates awx-mcp-*.vsix file ``` --- ## πŸ“Š Monitoring (Web Server) Access monitoring dashboards: - **Prometheus**: http://localhost:9090 - **Grafana**: http://localhost:3000 (admin/admin) - **Metrics Endpoint**: http://localhost:8000/prometheus-metrics ### Available Metrics - `awx_mcp_requests_total` - Total requests by tenant/endpoint - `awx_mcp_request_duration_seconds` - Request latency - `awx_mcp_active_connections` - Active connections per tenant - `awx_mcp_tool_calls_total` - MCP tool invocations - `awx_mcp_errors_total` - Error count by type --- ## πŸ“š Documentation ### Installation & Setup - **[Install from PyPI](https://pypi.org/project/awx-mcp-server/)** - Quick install with `pip install awx-mcp-server` - **[Install from Source](INSTALL_FROM_SOURCE.md)** - Fork, customize, and run from your own repository - **[OS Compatibility](OS_COMPATIBILITY.md)** - Windows, macOS, and Linux installation and configuration ### Platform Support - **[AAP Support Guide](AAP_SUPPORT.md)** - Complete guide for Ansible Automation Platform, AWX, and Ansible Tower ### Deployment Architectures - **[Deployment Architecture](DEPLOYMENT_ARCHITECTURE.md)** - Single-user vs Team/Enterprise deployment options - **[Remote Deployment Guide](server/REMOTE_DEPLOYMENT.md)** - Docker, Kubernetes, and cloud deployment - **[Dual-Mode Quick Start](DUAL_MODE_QUICKSTART.md)** - Quick reference for choosing deployment mode ### Advanced Features (Planned) - **[Vault Integration](server/VAULT_INTEGRATION.md)** - HashiCorp Vault, AWS Secrets Manager, Azure Key Vault support (v2.0.0) - **[Implementation Status](IMPLEMENTATION_STATUS.md)** - Current features and roadmap ### Additional Resources - **[MCP Copilot Setup](vscode-extension/MCP_COPILOT_SETUP.md)** - VS Code MCP configuration - **[Quick Reference](docs/QUICKREF.md)** - Common commands and examples - **[AWX MCP Query Reference](AWX_MCP_QUERY_REFERENCE.md)** - Natural language query examples --- ## 🀝 Contributing We welcome contributions! Please: 1. Fork the repository 2. Create a feature branch 3. Make your changes with tests 4. Submit a pull request ### Code Style - Python: Follow PEP 8, use type hints - TypeScript: Follow ESLint rules - Write tests for new features - Update documentation --- ## πŸ“„ License MIT License - see [LICENSE](LICENSE) file --- ## πŸ†˜ Support - **Issues**: https://github.com/your-org/awx-mcp/issues - **Discussions**: https://github.com/your-org/awx-mcp/discussions - **Documentation**: See README files in subdirectories --- ## πŸŽ‰ Quick Reference ### VS Code Extension Commands - `Ctrl+Shift+P` β†’ `AWX: Configure Environment` - `Ctrl+Shift+P` β†’ `AWX: Test Connection` - `Ctrl+Shift+P` β†’ `AWX: Switch Environment` - In Copilot Chat: `@awx ` ### Web Server CLI Commands ```bash awx-mcp-server start # Start HTTP server awx-mcp-server env list # List environments awx-mcp-server templates list # List templates awx-mcp-server jobs launch "Template" # Launch job awx-mcp-server jobs get 123 # Get job details awx-mcp-server projects list # List projects awx-mcp-server inventories list # List inventories ``` ### Web Server API Endpoints ``` POST /api/keys # Create API key GET /api/v1/environments # List environments GET /api/v1/job-templates # List templates POST /api/v1/jobs/launch # Launch job GET /api/v1/jobs/{id} # Get job GET /api/v1/jobs/{id}/stdout # Get output GET /api/v1/projects # List projects GET /api/v1/inventories # List inventories GET /health # Health check GET /prometheus-metrics # Metrics GET /docs # API documentation ``` --- **Made with ❀️ for AWX automation and AI integration**