Azure Infrastructure MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Azure Infrastructure MCP Serverlist my Azure VMs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Azure Infrastructure MCP Server
A Model Context Protocol (MCP) server for managing Azure infrastructure directly from AI assistants like Claude in Cursor, VS Code, Claude Desktop, or any MCP-compatible client.
What You Can Do
Manage Subscriptions — List and switch between Azure subscriptions
Inspect Accounts — View subscription details, get access tokens, clear cached credentials
Organize Resources — List and manage resource groups, tags, locks
Control VMs — Start, stop, restart, deallocate virtual machines and scale VMSS
Manage Storage — List and inspect storage accounts
App Configuration — Manage App Configuration stores and key-values
App Service — List and manage App Service plans and web apps
Deploy Web Apps — Create and manage Web Apps for Containers with Docker/Podman
Container Registry — List, create, and manage ACR instances, images, tasks, and network rules
Virtual Networks — Create and manage VNets, subnets, and peerings
Identity & Access — Manage Azure AD users, groups, applications, and RBAC permissions
Governance — Work with management groups, resource locks, and tags
Audit — View activity logs and track changes
Docker Runtime — List, inspect logs, and restart local Docker containers
Monitoring — System metrics, service health, and infrastructure status
Related MCP server: cloudscope-mcp
Quick Start
1. Prerequisites
Python 3.10+
Azure CLI installed and logged in (
az login)uv package manager (recommended) — or plain pip
2. Install
Option A — Install from PyPI (recommended):
pip install azops-mcp
# or
uv pip install azops-mcpOption B — Run with uvx (zero-install):
uvx azops-mcpuvx downloads the package into a cached, isolated environment and runs the server — nothing is installed permanently.
Option C — From source:
git clone https://github.com/artemkozlenkov/azops-mcp.git
cd azops-mcp
./quickstart.sh3. Configure Your AI Client
Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Important: Claude Desktop does not inherit your shell's
PATH. You must use the full absolute path touvx(or any other command). Find it withwhich uvx.
Using uvx (recommended — no install required):
{
"mcpServers": {
"azops-mcp": {
"command": "/Users/YOUR_USERNAME/.local/bin/uvx",
"args": ["azops-mcp"]
}
}
}Using a pip-installed package:
{
"mcpServers": {
"azops-mcp": {
"command": "/Users/YOUR_USERNAME/.local/bin/azops-mcp"
}
}
}Using a local clone (development):
{
"mcpServers": {
"azops-mcp": {
"command": "/Users/YOUR_USERNAME/.local/bin/uv",
"args": ["--directory", "/full/path/to/azops-mcp", "run", "python", "-m", "azops_mcp"]
}
}
}This error in ~/Library/Logs/Claude/mcp-server-azops-mcp.log means Claude Desktop cannot find the binary. Claude Desktop only searches system paths (/usr/local/bin, /opt/homebrew/bin, /usr/bin, /bin) — it does not search ~/.local/bin or paths from your shell profile.
Fix: Replace "command": "uvx" with the full path from which uvx (e.g. /Users/yourname/.local/bin/uvx).
Cursor — add to ~/.cursor/mcp.json:
{
"mcpServers": {
"azops-mcp": {
"command": "uvx",
"args": ["azops-mcp"]
}
}
}Windsurf — add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"azops-mcp": {
"command": "uvx",
"args": ["azops-mcp"]
}
}
}VS Code (GitHub Copilot) — add to .vscode/mcp.json in your workspace:
{
"servers": {
"azops-mcp": {
"command": "uvx",
"args": ["azops-mcp"]
}
}
}Zed — add to your Zed settings file:
{
"context_servers": {
"azops-mcp": {
"command": {
"path": "uvx",
"args": ["azops-mcp"]
}
}
}
}Continue (VS Code / JetBrains) — add to ~/.continue/config.yaml:
mcpServers:
- name: azops-mcp
command: uvx
args:
- azops-mcpNote: Cursor, Windsurf, VS Code, and Zed inherit your shell's
PATH, souvxusually works as-is. If not, use the full path fromwhich uvx. See the full docs for details.
To pass environment variables (e.g. Azure credentials), add an "env" key:
{
"mcpServers": {
"azops-mcp": {
"command": "uvx",
"args": ["azops-mcp"],
"env": {
"AZURE_SUBSCRIPTION_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}Restart your AI client after saving the configuration.
4. Start Using
User: List my Azure subscriptions
User: Show resource groups in subscription xxx-xxx-xxx
User: Start the VM "web-server" in resource group "production"
User: What VMs are running in my dev resource group?Authentication
Priority | Method | When |
1 | Service Principal |
|
2 | Azure CLI | After |
3 | Managed Identity | When running in Azure |
See the Authentication docs for the full walkthrough.
Available Tools (90+)
Category | Tools |
Health |
|
Subscriptions & Auth |
|
Management Groups |
|
RBAC |
|
Governance |
|
Resource Groups |
|
VMs & VMSS |
|
Storage |
|
App Configuration |
|
App Service |
|
Web Apps for Containers |
|
Container Registry |
|
Virtual Networks |
|
Azure AD (Entra ID) |
|
Docker Runtime |
|
Monitoring |
|
Docker
Run the MCP server as a container:
# Build the image
docker compose build
# Run the MCP server interactively (stdio transport)
docker compose run --rm mcp-serverSee the Docker docs for full instructions.
Project Structure
azops-mcp/
├── src/azops_mcp/
│ ├── __main__.py # Module entry point
│ ├── server.py # MCP server — 93 tool definitions
│ ├── config.py # Configuration management
│ ├── tools/ # Azure SDK integrations (by category)
│ │ ├── _clients.py # Shared auth & Azure SDK client factories
│ │ ├── subscription.py # Subscriptions, auth, tenants, locations
│ │ ├── resource_groups.py # Resource groups, tags, locks, activity log
│ │ ├── compute.py # VMs, VMSS, resource listing
│ │ ├── networking.py # VNets, subnets, peerings
│ │ ├── authorization.py # RBAC roles & assignments
│ │ ├── management_groups.py # Management group hierarchy
│ │ ├── app_configuration.py # App Configuration stores & key-values
│ │ ├── app_service.py # App Service plans & web apps
│ │ ├── container_registry.py # Azure Container Registry (ACR)
│ │ ├── active_directory.py # Azure AD / Entra ID
│ │ ├── webapp_deployment.py # Web App for Containers deployment
│ │ ├── docker.py # Local Docker container runtime
│ │ └── monitoring.py # System metrics & health
│ └── utils/
│ └── helpers.py # HTTP client, error formatting
├── tests/ # Unit tests (per integration)
│ ├── test_subscription.py
│ ├── test_resource_groups.py
│ ├── test_compute.py
│ ├── test_networking.py
│ ├── test_authorization.py
│ ├── test_container_registry.py
│ ├── test_active_directory.py
│ ├── test_webapp_deployment.py
│ ├── test_docker.py
│ ├── test_monitoring.py
│ ├── test_health.py
│ └── test_config.py
├── docs/ # GitHub Pages documentation
├── Dockerfile # MCP server container image
├── docker-compose.yml # Docker Compose for the MCP server
├── pyproject.toml # Dependencies & metadata
├── quickstart.sh # Setup script
└── .env.example # Configuration templateConfiguration
Variable | Default | Description |
| — | Default subscription |
|
| Default region for new resources |
|
|
|
|
| Enable rate limiting |
|
| Max requests/minute |
See .env.example for the complete list.
Development
# Install with dev dependencies
uv pip install -e ".[dev]"
# Run tests
pytest
# Code quality
black src/ tests/
ruff check src/ tests/
mypy src/
# Run server manually
uv run python -m azops_mcpDocumentation
Full documentation is available at azops.softawebit.com.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/artemkozlenkov/azops-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server