Avm Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Avm Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MCP Server for discovering and exploring Azure Verified Modules (AVM) from the Bicep Public Registry.
This MCP server enables AI agents and tools to search, discover, and retrieve detailed information about Azure Verified Modules (AVM) via the Model Context Protocol (MCP). It connects directly to the Microsoft Container Registry (MCR) and GitHub to provide up-to-date module information, versions, parameters, and usage examples.
Azure Verified Modules (AVM) are a collection of standardized, validated, and well-documented Infrastructure as Code (IaC) modules for deploying Azure resources using Bicep. However, discovering the right module and understanding its parameters can be challenging:
This MCP server solves these challenges by:
Microsoft provides an official Bicep MCP Server that includes a ListAvmMetadata tool. So why create a separate AVM MCP Server?
| Feature | Microsoft Bicep MCP Server | AVM MCP Server (This Project) |
|---|---|---|
| Primary Focus | Bicep language tools & Azure resource schemas | AVM module discovery & documentation |
| AVM Module Search | Lists all modules (no filtering) | Intelligent search with multiple query formats |
| Module Details | Basic metadata (name, description, versions) | Deep documentation extraction (parameters, resource types, examples) |
| Installation | Requires .NET runtime & Bicep CLI | Lightweight Python with minimal dependencies |
| Response Format | Newline-separated text summary | Structured JSON with rich metadata |
| Documentation Access | External links only | Extracted and formatted markdown from module READMs |
While the official Bicep MCP Server is excellent for authoring Bicep templates and accessing Azure resource type schemas, it provides limited functionality for discovering and understanding AVM modules:
ListAvmMetadata tool returns ALL modules without filtering, making it difficult to find relevant modules when there are hundreds available. This server provides intelligent search that handles variations like "key vault", "key-vault", and "keyvault".Choose Microsoft Bicep MCP Server if you need:
Choose AVM MCP Server if you need:
Use both servers together for a complete Bicep + AVM development experience!
https://www.python.org/downloads/
https://github.com/astral-sh/uv UV Documentation
irm https://astral.sh/uv/install.ps1 | iexOr, using pip (if you already have Python and pip installed):
pip install uv curl -LsSf https://astral.sh/uv/install.sh | sh git clone https://github.com/stefanstranger/avm-mcp-server.git
cd avm-mcp-server uv venv .venv --python 3.13 .\.venv\Scripts\Activate.ps1 source .venv/bin/activate uv pip install fastmcp requests#### Option 1: Using uvx with GitHub Repository (Recommended)
Use the following command to add the AVM MCP server to your local environment. This assumes uvx is in your $PATH; if not, then you need to provide the full path to uvx.
Add the following to your claude_desktop_config.json file:
{
"mcpServers": {
"avm-mcp-server": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"git+https://github.com/stefanstranger/avm-mcp-server",
"avm-mcp-server"
]
}
}
}or mcp.json for Visual Code mcp configuration.
{
"servers": {
"avm-mcp-server-github": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"git+https://github.com/stefanstranger/[email protected]",
"avm-mcp-server"
]
}
},
"inputs": []
}This approach:
To use a specific version/tag, modify the GitHub URL:
"git+https://github.com/stefanstranger/[email protected]"#### Option 2: Using Local Installation
If you prefer to run from a local clone:
{
"mcpServers": {
"avm-mcp-server": {
"type": "stdio",
"command": "uv",
"args": [
"run",
"--with",
"mcp[cli]",
"--with",
"requests",
"mcp",
"run",
"C:\\Github\\avm-mcp-server\\server.py"
]
}
}
}Note: Adjust the path in the last args element to match your installation location.
Run directly from GitHub:
uvx --from git+https://github.com/stefanstranger/avm-mcp-server avm-mcp-serverOr with a specific version:
uvx --from git+https://github.com/stefanstranger/[email protected] avm-mcp-serverIf you cloned the repository:
uv run .\server.pyThe server now supports multiple transport methods for different use cases:
#### 1. STDIO Transport (Default)
Standard input/output - ideal for Claude Desktop and MCP Inspector:
python server.py --transport stdioThis is the default mode and is used when no transport is specified.
#### 2. HTTP Transport
Streamable HTTP transport - ideal for web applications and REST API integrations:
python server.py --transport http --host 0.0.0.0 --port 8080Test the server is running:
# Simple tools listing endpoint (GET request)
curl http://localhost:8080/tools
# MCP protocol endpoint (requires POST with JSON-RPC format)
curl -X POST http://localhost:8080/mcp/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {"name": "test-client", "version": "1.0.0"}
}
}'Note: The MCP endpoint (/mcp/) requires a trailing slash and expects POST requests with JSON-RPC formatted data.
#### 3. SSE Transport
Server-Sent Events transport - ideal for real-time streaming applications:
python server.py --transport sse --host 0.0.0.0 --port 8080#### Additional Options
--debug: Enable debug logging--host: Host address to bind to (default: 0.0.0.0 for HTTP/SSE)--port: Port to use (default: 8080 for HTTP/SSE)Example with debug mode:
python server.py --transport http --port 8081 --debug#### Configuration via Environment Variables
You can also configure the server using a .env file:
MCP_HOST=0.0.0.0
MCP_PORT=8080
MCP_DEBUG=false
LOG_LEVEL=INFOFor containerized deployments, use the included Dockerfile:
# Build the image
docker build -t avm-mcp-server .
# Run the container
docker run -p 8080:8080 avm-mcp-serverThe container runs in HTTP transport mode on port 8080 by default. To use a different port:
docker run -p 9000:8080 avm-mcp-serverTo run with SSE transport instead:
docker run -p 8080:8080 avm-mcp-server python server.py --transport sse --port 8080For local development on Linux or macOS, use the setup script to quickly create a virtual environment and install dependencies:
chmod +x setup.sh
./setup.shThis script:
.venv)requirements.txtNote: For Windows users or those using UV, follow the standard Installation steps instead.
The MCP Inspector is a useful tool for testing and debugging MCP servers.
#### STDIO Transport (Default)
Using uvx from GitHub:
npx @modelcontextprotocol/inspector uvx --from git+https://github.com/stefanstranger/avm-mcp-server avm-mcp-serverUsing local installation:
npx @modelcontextprotocol/inspector uv run --with mcp[cli] mcp run c://github//avm-mcp-server//server.py#### HTTP Transport
First, start the server in HTTP mode:
python server.py --transport http --port 8080Then open the MCP Inspector web UI and connect to the HTTP endpoint:
npx @modelcontextprotocol/inspectorIn the Inspector UI, enter http://localhost:8080/mcp/ as the server URL and select "Streamable HTTP" as the transport type.
Alternatively, use curl to verify the server is running:
# Check the tools endpoint
curl http://localhost:8080/tools
# Or test the MCP endpoint directly
curl -X POST http://localhost:8080/mcp/ `
-H "Content-Type: application/json" `
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'#### SSE Transport
First, start the server in SSE mode:
python server.py --transport sse --port 8080Then open the MCP Inspector web UI:
npx @modelcontextprotocol/inspectorIn the Inspector UI, enter http://localhost:8080/sse as the server URL and select "SSE" as the transport type.
#### Using mcptools
mcptools provides an alternative way to inspect MCP servers:
# STDIO transport
mcptools web cmd /c "uvx.exe --from git+https://github.com/stefanstranger/avm-mcp-server avm-mcp-server"
# List tools
mcptools tools cmd /c "uvx.exe --from git+https://github.com/stefanstranger/avm-mcp-server avm-mcp-server"
# Call a specific tool
mcptools call list_avm_modules --modulename "storage" cmd /c "uvx.exe --from git+https://github.com/stefanstranger/avm-mcp-server avm-mcp-server"list_avm_modulesSearch and list Azure Verified Modules from the Bicep Public Registry.
Parameters:
modulename (optional): Module name to filter by. Supports multiple formats:"storage-account""key-vault""key vault" (matches "key-vault", "keyvault", "key", or "vault")"keyvault"Returns: JSON array with module information including:
Example Usage:
"List all AVM modules for storage accounts"
"Find Azure Verified Modules for key vault"
"Show me AVM modules related to networking"Example Response:
[
{
"name": "bicep/avm/res/storage/storage-account",
"versions": ["0.9.1", "0.9.0", "0.8.3"],
"description": "Azure Verified Module",
"documentation": "https://github.com/Azure/bicep-registry-modules/tree/main/avm/res/storage/storage-account"
}
]scrape_avm_module_detailsFetch detailed information from an AVM module's README documentation.
Parameters:
url (required): GitHub URL of the AVM module repositoryhttps://github.com/Azure/bicep-registry-modules/tree/main/avm/res/storage/storage-accountReturns: Formatted markdown containing:
Example Usage:
"Get the details for the storage account AVM module"
"Show me the parameters for the key vault module"
"What resources does the virtual network module deploy?"Example Response:
## Resource Types
| Resource Type | API Version |
| :-- | :-- |
| `Microsoft.Storage/storageAccounts` | [2022-09-01] |
| `Microsoft.Storage/storageAccounts/blobServices` | [2022-09-01] |
## Parameters
**Required parameters**
| Parameter | Type | Description |
| :-- | :-- | :-- |
| [`name`](#parameter-name) | string | Name of the Storage Account. |
**Optional parameters**
| Parameter | Type | Description |
| :-- | :-- | :-- |
| [`location`](#parameter-location) | string | Location for all resources. |
...find_avm_module_promptA prompt to find Azure Verified Modules (AVM).
Parameters:
search_term (optional): The search term to use to find AVM modules.Example Usage:
"Find AVM modules for 'storage account'"get_avm_module_details_promptA prompt to get the details of a specific AVM.
Parameters:
module_name (required): The name of the AVM module.Example Usage:
"Get details for the 'storage-account' AVM module"suggest_avm_for_service_promptA prompt to suggest an AVM for a specific Azure service.
Parameters:
azure_service (required): The Azure service to find an AVM for.Example Usage:
"Suggest an AVM for 'Azure Key Vault'""Find all AVM modules for storage"
"List Azure Verified Modules for Key Vault"
"Show me networking modules""What versions are available for the storage account module?"
"List all versions of the AVM key vault module""Show me the parameters for bicep/avm/res/storage/storage-account"
"What resources does the virtual network module deploy?"
"Get usage examples for the key vault module""Find the storage account AVM module and show me its parameters"
"I need to deploy a key vault - find the module and explain its parameters"
"Search for virtual network modules and show me usage examples"mcr.microsoft.com/v2/_catalog)bicep/avm/mcr.microsoft.comraw.githubusercontent.comclaude_desktop_config.json is correctThe project includes a comprehensive test suite to ensure code quality and catch issues before release.
# Install dev dependencies
uv sync --dev
# Run all tests
uv run pytest
# Run tests with verbose output
uv run pytest -vThe test suite (tests/test_distribution.py) validates:
| Test | Purpose |
|---|---|
test_required_files_in_wheel | Ensures server.py and config.py are included in the wheel |
test_required_dependencies | Verifies all runtime dependencies are listed |
test_entry_point_configured | Confirms CLI entry point is defined |
test_modules_import | Catches import errors from missing files/dependencies |
These tests specifically target issues that have caused runtime failures (missing modules, missing dependencies).
Tests run automatically on:
main and feature/** branchesmainThe CI workflow tests against Python 3.10, 3.11, 3.12, and 3.13 to ensure compatibility.
This server is published to both PyPI and the MCP Registry for easy installation and discovery.
The recommended way to use this server is via uvx from PyPI:
# Run directly without installation
uvx avm-mcp-server
# Or install globally
uv tool install avm-mcp-serverThis server is registered in the MCP Registry, making it discoverable by MCP clients and AI assistants.
Registry Entry: io.github.stefanstranger/avm-mcp-server
The project uses automated GitHub Actions workflows to publish new versions. Publishing is triggered automatically when a feature branch is merged to main with a version bump.
pyproject.toml - Package versionserver.py - FastMCP instance version # On your feature branch
git add pyproject.toml server.py
git commit -m "Bump version to X.Y.Z"
git push
# Create PR and merge to mainpyproject.tomlvX.Y.Z automaticallyserver.json with new versionNote: The workflow only triggers when pyproject.toml changes and the version doesn't already have a tag. This prevents duplicate publishes.
For the initial PyPI release, publish manually:
# Build the package
uv build
# Publish to PyPI (will prompt for token)
uv publishRequirements:
<!-- mcp-name: io.github.stefanstranger/avm-mcp-server -->Note: PyPI versions cannot be re-uploaded. Always bump the version number for new releases.
MIT License
Contributions are welcome! Please feel free to submit a Pull Request.
This tool is not officially affiliated with or endorsed by Microsoft or the Azure Verified Modules team. It provides read-only access to publicly available module information from the Microsoft Container Registry and GitHub.
<!-- mcp-name: io.github.stefanstranger/avm-mcp-server -->
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.