About mcp-azure
mcp-azure is an MCP server for inventorying and operating Azure resources through Azure Resource Manager. Its configurable governance controls scope, write access, and destructive actions, with confirmation and audit options.
Key features
- 01List subscriptions and resources
- 02Create resource groups and merge tags
- 03Control VM power state
- 04Delete resources with gated access
- 05Configure allowlists and access modes
- 06Dry-run and JSON audit logging
Use cases
- 01Review subscription and resource-group inventory
- 02Tag resources or control VM power
- 03Limit an agent to approved subscriptions and regions
- 04Require approval before destructive changes
MCP support
Exposes Azure Resource Manager inventory and operation tools to MCP clients. Available tools depend on the configured access mode, and destructive actions can require human elicitation or typed confirmation.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @dockndevai/mcp-azureAZURE_TENANT_IDEntra ID tenant id.AZURE_CLIENT_IDApp registration (service principal) client id.AZURE_CLIENT_SECRETSecretService principal client secret.AZURE_SUBSCRIPTION_IDDefault subscription id.AZURE_MODEAccess mode: read-only | read-write | admin.Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
5Saved tool list · updated 2w ago
This tool takes no parameters.
Details
From the project READMEmcp-azure
A Model Context Protocol server for Azure (via the Azure Resource Manager API — the programmatic layer behind the Azure Portal). It lets an MCP-capable client (Claude Desktop, Claude Code, Cursor, Codex, …) inventory and operate Azure resources — with a governance layer that keeps an AI agent inside safe boundaries.
What this offers
- Inventory — list subscriptions, locations, resource groups, and resources; get any resource by ARM id.
- Operations — create resource groups (in approved regions), merge tags onto any resource, and control VM power state (start / stop / restart / deallocate).
- Lifecycle — delete resource groups and individual resources, guarded.
- Governance built in — access modes, subscription/resource-group allowlists, protected resource groups, a location allowlist for new groups, delete gating, typed confirmation for high-impact deletes, dry-run, and JSON audit logging.
Governance & security model
| Concern | Flag | Default | Effect |
|---|---|---|---|
| What can the server do? | AZURE_MODE | read-only | read-only → inventory; read-write → create RG, tag, VM power; admin → deletes. Tools above the mode are never registered. |
| Which subscriptions? | AZURE_SUBSCRIPTION_ALLOWLIST | (all) | Operations on other subscriptions are refused. |
| Which resource groups? | AZURE_RESOURCE_GROUP_ALLOWLIST | (all) | Operations outside the list are refused. |
| Read-only-forever groups | AZURE_PROTECTED_RESOURCE_GROUPS | (none) | Readable, never mutable. |
| Approved regions | AZURE_LOCATION_ALLOWLIST | (any) | New resource groups may only be created here. |
| Can it delete? | AZURE_ALLOW_DELETE | false | Deletes need this and admin mode. |
| Typed confirmation | AZURE_REQUIRE_CONFIRMATION | true | Deletes require confirm to equal the target name — not just a boolean. |
| Preview | AZURE_DRY_RUN | false | Write/admin tools validate + log intent, then return. |
| Audit trail | AZURE_AUDIT_LOG | true | JSON line to stderr per guarded operation. |
| Interactive confirmation | (automatic) | — | Destructive & high-impact actions prompt the human to approve via MCP elicitation before running; clients without elicitation fall back to the *_ALLOW_* gate. |
Tools
Read (read-only+): list_subscriptions, list_locations, list_resource_groups, list_resources, get_resource
Write (read-write+): create_resource_group, tag_resource, control_vm
Admin (admin): delete_resource_group, delete_resource (both need AZURE_ALLOW_DELETE + typed confirm)
Quickstart — add to your agent
Published on npm as @dockndevai/mcp-azure. Runs via npx with an Entra ID service principal. See docs/CLIENTS.md for every client and .env.example for all variables.
Claude Code
claude mcp add azure -e AZURE_TENANT_ID="…" -e AZURE_CLIENT_ID="…" -e AZURE_CLIENT_SECRET="…" -e AZURE_SUBSCRIPTION_ID="…" -e AZURE_MODE="read-only" -- npx -y @dockndevai/mcp-azure
Claude Desktop · Cursor · Windsurf
{
"mcpServers": {
"azure": {
"command": "npx",
"args": ["-y", "@dockndevai/mcp-azure"],
"env": {
"AZURE_TENANT_ID": "…",
"AZURE_CLIENT_ID": "…",
"AZURE_CLIENT_SECRET": "…",
"AZURE_SUBSCRIPTION_ID": "…",
"AZURE_MODE": "read-only"
}
}
}
}
Example prompts
- "List all resource groups in my subscription and which region each is in"
- "Show every resource in the rg-web group"
- "Tag the app-plan resource with env=prod and owner=team-a" (needs read-write)
- "Stop the build-agent VM in rg-ci" (needs read-write)
Run from source (development)
npm install
npm run build
node dist/index.js # with the environment variables set
Develop
npm run dev
npm test # governance policy: modes, scoping, location allowlist, delete + confirmation
npm run typecheck
Publishing
Ships a server.json for the official MCP registry and an mcpName for npm ownership validation. See PUBLISHING.md.
License
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.