Gives Claude direct control over AWX, Ansible Automation Platform, and Ansible Tower through 49 tools covering job templates, inventory, projects, and workflow execution. You can launch jobs with natural language, monitor playbook runs in real time, and manage infrastructure automation without touching the AWX UI. Works through standard MCP stdio transport, but also ships with a REST API mode if you're building team chatbots or need multi-tenant access with API keys. Install via pip or run from source if you want to fork and customize. Supports the full AWX API surface, from launching templates with extra vars to pulling job stdout and managing project updates.
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!
Standard MCP implementation using STDIO transport (like Postman MCP, Claude MCP)
Use Case: AI assistants (GitHub Copilot, Claude, Cursor) + AWX automation
Features:
pip install git+https://github.com/USERNAME/awx-mcp-server.gitBest For: AI-powered automation, natural language AWX control, any MCP client
Optional UI features for VS Code users
Use Case: VS Code users who want additional UI (sidebar views, tree providers)
Features:
Best For: VS Code users wanting rich UI alongside MCP functionality
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 the MCP server
pip install awx-mcp-server
# Verify installation
python -m awx_mcp_server --version
Edit VS Code settings.json (Ctrl+, → Search "chat.mcp"):
{
"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.
Perfect for: Forking, customization, enterprise deployments, contributing
Quick install:
# 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):
{
"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 for:
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
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
# 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
# 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"
cd server/deployment/helm
helm install awx-mcp-server . \
--set replicaCount=3 \
--set autoscaling.enabled=true \
--set taskPods.enabled=true
See: server/README.md for detailed guide
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")
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']}")
Both VS Code extension and web server support all 16 operations:
env_list - List all configured AWX environmentsenv_test - Test connection to AWX environmentenv_get_active - Get currently active environmentlist_job_templates - List all job templates (with filtering)get_job_template - Get template details by name/IDlist_jobs - List all jobs (filter by status, date)get_job - Get job details by IDjob_launch - Launch job from templatejob_cancel - Cancel running jobjob_stdout - Get job output/logsjob_events - Get job events (playbook tasks)list_projects - List all projectsproject_update - Update project from SCMlist_inventories - List all inventoriesget_inventory - Get inventory detailsawx-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
┌─────────────────┐
│ VS Code IDE │
│ │
│ ┌───────────┐ │ stdio ┌──────────────┐
│ │ GitHub │──┼────transport───▶│ MCP Server │
│ │ Copilot │ │ (local) │ (shared) │
│ │ Chat │◀─┼────────────────│ 16 Tools │
│ └───────────┘ │ └──────────────┘
│ │ │
│ ┌───────────┐ │ │
│ │ @awx Chat │ │ │
│ │Participant│ │ ▼
│ └───────────┘ │ ┌──────────────┐
└─────────────────┘ │ AWX │
│ Instance │
└──────────────┘
Flow:
@awx list templates in Copilot Chat┌──────────────┐ REST API ┌──────────────┐
│ Chatbot │────────────────────▶│ FastAPI │
│ /Custom App │ (HTTP/JSON) │ Server │
└──────────────┘ └──────────────┘
│
┌──────────────┐ REST API │
│ Slack Bot │────────────────────▶│
└──────────────┘ │
│
┌──────────────┐ CLI │
│ Terminal │────────────────────▶│
│ Scripts │ (commands) │
└──────────────┘ │
│
┌──────┴───────┐
│ │
│ Clients │
│ REST + CLI │
│ │
└──────┬───────┘
│
▼
┌──────────────┐
│ AWX │
│ Instance │
└──────────────┘
Flow:
cd server
pip install -e .
awx-mcp-server start
cd server
docker-compose up -d
Includes: Server, Prometheus, Grafana
cd server/deployment/helm
helm install awx-mcp-server . \
--set autoscaling.enabled=true \
--set taskPods.enabled=true \
--set ingress.enabled=true
Features:
# 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
# Server tests
cd server
pytest tests/ -v --cov
# Integration tests
cd tests
pytest test_mcp_integration.py -v
cd vscode-extension
npm run package
# Generates awx-mcp-*.vsix file
Access monitoring dashboards:
awx_mcp_requests_total - Total requests by tenant/endpointawx_mcp_request_duration_seconds - Request latencyawx_mcp_active_connections - Active connections per tenantawx_mcp_tool_calls_total - MCP tool invocationsawx_mcp_errors_total - Error count by typepip install awx-mcp-serverWe welcome contributions! Please:
MIT License - see LICENSE file
Ctrl+Shift+P → AWX: Configure EnvironmentCtrl+Shift+P → AWX: Test ConnectionCtrl+Shift+P → AWX: Switch Environment@awx <your command>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
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
AWX_BASE_URL*The base URL of your AWX/Ansible Tower instance
AWX_TOKENsecretAWX API token for authentication
AWX_USERNAMEAWX username (alternative to token)
AWX_PASSWORDsecretAWX password (alternative to token)
AWX_VERIFY_SSLWhether to verify SSL certificates (set to false for self-signed)
silenceper/mcp-k8s
azure/containerization-assist
io.github.evozim/aws-builder
reza-gholizade/k8s-mcp-server
flux159/mcp-server-kubernetes