# Azure MCP CLI Command Reference > [!IMPORTANT] > The Azure MCP Server has two modes: MCP Server mode and CLI mode. When you start the MCP Server with `azmcp server start` that will expose an endpoint for MCP Client communication. The `azmcp` CLI also exposes all of the tools via a command line interface, i.e. `azmcp subscription list`. In this document, "command" refers to CLI commands (e.g., `azmcp storage account list`), while "tool" refers to MCP server tools that can be invoked by MCP clients. ## Global Options The following options are available for most commands: | Option | Required | Default | Description | |-----------|----------|---------|-------------| | `--subscription` | No | Azure CLI profile default or `AZURE_SUBSCRIPTION_ID` env var | The Azure subscription GUID identifier or display name. If not specified, the Azure CLI profile default subscription or `AZURE_SUBSCRIPTION_ID` environment variable will be used. | | `--tenant` | No | - | The Microsoft Entra ID tenant GUID identifier or display name. | | `--learn` | No | false | Discover available sub-commands and their parameters without executing any Azure operation. Use on a command group to list commands in that group, or on a specific command to see its options. | ### Discovery with `--learn` The `--learn` flag enables AI agents and users to progressively discover the Azure MCP CLI without starting an MCP server. It works at every level of the command hierarchy: ```bash # List all commands available under the 'storage' namespace azmcp storage --learn # List all commands under 'storage account' azmcp storage account --learn # Show the options for a specific command without executing it azmcp storage account list --learn ``` The output is a JSON `CommandResponse` containing a list of `CommandInfo` objects with the command name, description, full CLI path, and all supported options. This is equivalent to the `learn` parameter supported by the Azure MCP server tools in namespace mode. ### CLI Logging In CLI mode, all `azmcp` commands write only JSON to **stdout**. Informational and diagnostic log messages are written to **stderr**. This means AI agents and tools consuming stdout receive clean JSON without log noise. To see logs while running a CLI command: ```powershell # Show logs in terminal alongside JSON output (PowerShell / bash) azmcp storage account list --subscription 2>&1 # Capture JSON silently, discard logs (PowerShell) $json = azmcp storage account list --subscription 2>$null # Write logs to a file while JSON goes to stdout azmcp storage account list --subscription 2>azmcp.log ``` ## Available Commands ### Server Operations The Azure MCP Server can be started in several different modes depending on how you want to expose the Azure tools: #### Using azmcp locally vs in container images The commands in this document assume you are running the **`azmcp` CLI locally** for example as a .NET global tool. In that case the executable is called `azmcp` and commands such as: ```bash azmcp server start --mode namespace --transport=stdio ``` are valid. When you run the **Azure MCP Server container image** `mcr.microsoft.com/azure-sdk/azure-mcp` (for example in Azure Container Apps), the image already contains an entrypoint that starts the MCP server process. The image does **not** support overriding the container command with `azmcp ...` directly, as the entrypoint is already configured to start the server. - Do **not** override the container command / entrypoint with `azmcp ...` when deploying the image. Doing so will cause the container to fail to start. - Leave the command / entrypoint blank in Azure Container Apps so the default image entrypoint is used. - If you need to customize the startup command or add extra arguments, build your own image based on the Azure MCP Server and set the ENTRYPOINT and/or CMD values in your Dockerfile there. That way you control exactly how the server starts without replacing the upstream image entrypoint at runtime. > [!NOTE] > ENTRYPOINT defines the executable that always runs; CMD provides > default arguments to that executable. Overriding the container command in > many PaaS providers replaces the image's ENTRYPOINT/CMD behavior, which can > break startup. The Azure MCP Server image ENTRYPOINT in the repository is: ```text ENTRYPOINT ["./server-binary", "server", "start"] ``` Because the image sets a fixed entrypoint, passing a container command such as `azmcp ...` will replace or conflict with that entrypoint. If you must change startup behavior, create a small derived Dockerfile that modifies the ENTRYPOINT/CMD as needed and deploy your custom image instead of overriding the command in the PaaS UI. For the exact Dockerfile used to build the image see: https://github.com/microsoft/mcp/blob/main/Dockerfile The remaining sections describe the different server modes that apply to both the CLI and the container image entrypoint. #### Default Mode (Namespace) Exposes Azure tools grouped by service namespace. Each Azure service appears as a single namespace-level tool that routes to individual operations internally. This is the default mode to reduce tool count and prevent VS Code from hitting the 128 tool limit. If a tool call specifies an unavailable `command`, the router can make one correction attempt using the supplied `intent` when the MCP client supports sampling. If it cannot resolve the command, it returns a tool error listing only the command names available to that tool under the current server configuration, without descriptions or parameter schemas. Select the command that best matches the current intent. To request the full command catalog without executing a command, set `learn=true` with an empty `intent`. An `intent` that is not blank can trigger sampling and execution even when `learn=true`. This behavior also applies to consolidated mode and external-server routing in these modes; CLI help is unchanged. ```bash # Start MCP Server with namespace-level tools (default behavior) azmcp server start \ [--transport ] \ [--read-only] # Explicitly specify namespace mode azmcp server start \ --mode namespace \ [--transport ] \ [--read-only] ``` #### All Tools Mode Exposes all Azure tools individually. Each Azure service operation appears as a separate MCP tool. ```bash # Start MCP Server with all tools exposed individually azmcp server start \ --mode all \ [--transport ] \ [--read-only] ``` #### Single Tool Mode Exposes a single "azure" tool that handles internal routing across all Azure MCP tools. ```bash # Start MCP Server with single azure tool azmcp server start \ --mode single \ [--transport ] \ [--read-only] ``` #### Namespace Filtering Exposes only tools for specific Azure service namespaces. Use multiple `--namespace` parameters to include multiple namespaces. ```bash # Start MCP Server with only Storage tools azmcp server start \ --namespace storage \ --mode all \ [--transport ] \ [--read-only] # Start MCP Server with Storage and Key Vault tools azmcp server start \ --namespace storage \ --namespace keyvault \ --mode all \ [--transport ] \ [--read-only] ``` #### Specific Tool Filtering Exposes only specific tools by name, providing the finest level of granularity. The `--namespace` and `--tool` options cannot be used together. Use multiple `--tool` parameters to include multiple tools. Using `--tool` automatically switches to `all` mode. ```bash # Start MCP Server with default mode and only subscription and resource group tools azmcp server start \ --tool azmcp_subscription_list \ --tool azmcp_group_list \ [--transport ] \ [--read-only] # Start MCP Server with all mode and essential storage management tools azmcp server start \ --mode all \ --tool azmcp_storage_account_get \ --tool azmcp_storage_account_create \ --tool azmcp_storage_blob_get \ [--transport ] \ [--read-only] ``` #### Structured Output Mode Enables MCP protocol structured output (`outputSchema` and `structuredContent`) for compatible clients. Two sub-modes are available: - `duplicated` — returns the complete result in both `content` and `structuredContent` - `compact` — returns concise text in `content` and the complete result in `structuredContent` Enable this only when the client has negotiated MCP protocol version `2025-06-18` or newer. ```bash # Start MCP Server with structured output (duplicated mode - full content in both fields) azmcp server start \ --mode all \ --structured-output-mode duplicated # Start MCP Server with structured output (compact mode - concise content, full structuredContent) azmcp server start \ --mode all \ --structured-output-mode compact ``` > For tool authors who want to emit `outputSchema` and `structuredContent` from their commands, see the [Output Schema Migration Guide](https://github.com/microsoft/mcp/blob/main/docs/output-schema-migration.md). #### Consolidated Mode Exposes carefully curated tools that group related Azure operations together based on common user workflows and tasks. This mode provides the optimal balance between discoverability and usability by organizing consolidated tools that combine multiple related operations. Each consolidated tool groups operations that are commonly used together: - **Resource management**: Groups operations by resource type and action (get, create, edit, delete) - **Workflow-based**: Organizes tools around common tasks (deployment, monitoring, security) - **Metadata-aligned**: Only groups commands with exactly the same toolMetadata values (destructive, idempotent, readOnly, etc.) **Benefits:** - **Better for AI agents**: Reduces decision complexity by presenting meaningful tool groupings - **Optimized tool count**: Well under VS Code's 128-tool limit - **Task-oriented**: Tools are named after user intents (e.g., `get_azure_databases_details`, `deploy_azure_resources_and_applications`) - **Maintains functionality**: All individual commands are still accessible through the consolidated tools ```bash # Start MCP Server with consolidated mode azmcp server start \ --mode consolidated \ [--transport ] \ [--namespace ] \ [--read-only] ``` **Configuration file location**: The consolidated tool definitions are maintained in `core/Azure.Mcp.Core/src/Areas/Server/Resources/consolidated-tools.json`. Each definition includes: - Tool name and description optimized for AI agent selection - List of mapped individual commands - Matching toolMetadata (destructive, idempotent, readOnly, secret, etc.) #### Namespace Mode (Default) Collapses all tools within each namespace into a single tool (e.g., all storage operations become one "storage" tool with internal routing). This mode is particularly useful when working with MCP clients that have tool limits - for example, VS Code only supports a maximum of 128 tools across all registered MCP servers. ```bash # Start MCP Server with service proxy tools azmcp server start \ --mode namespace \ [--transport ] \ [--read-only] ``` #### Single Tool Proxy Mode Exposes a single "azure" tool that handles internal routing across all Azure MCP tools. ```bash # Start MCP Server with single Azure tool proxy azmcp server start \ --mode single \ [--transport ] \ [--read-only] ``` > **Note:** > > - For namespace mode, replace `` with available top level command groups. Run `azmcp -h` to review available namespaces. Examples include `storage`, `keyvault`, `cosmos`, `monitor`, etc. > - The `--read-only` flag applies to all modes and filters the tool list to only contain tools that provide read-only operations. > - Multiple `--namespace` parameters can be used together to expose tools for multiple specific namespaces. > - The `--namespace` and `--mode` parameters can also be combined to provide a unique running mode based on the desired scenario. #### Server Start Command Options The `azmcp server start` command supports the following options: | Option | Required | Default | Description | |--------|----------|---------|-------------| | `--transport` | No | `stdio` | Transport mechanism to use. Valid values: `stdio` (default, supported in all distributions) or `http` (supported only in the Docker image distribution and other builds with HTTP enabled; may not be available in local CLI builds). | | `--mode` | No | `namespace` | Server mode: `namespace` (default), `consolidated`, `all`, or `single` | | `--namespace` | No | All namespaces | Specific Azure service namespaces to expose (can be repeated). Works with all existing modes to filter tools. | | `--tool` | No | All tools | Expose specific tools by name (e.g., 'azmcp_storage_account_get'). It automatically switches to `all` mode. It can't be used together with `--namespace`. | | `--read-only` | No | `false` | Only expose read-only operations | | `--debug` | No | `false` | Enable verbose debug logging to stderr | | `--dangerously-disable-http-incoming-auth` | No | false | Dangerously disable HTTP incoming authentication | | `--dangerously-disable-elicitation` | No | `false` | **⚠️ DANGEROUS**: Disable user consent prompts for sensitive operations | | `--dangerously-disable-ssrf-protections-by-namespace` | No | None | **⚠️ DANGEROUS**: Disable endpoint SSRF validation for a tool namespace. Repeat the option for multiple namespaces, or specify `ALL` to disable it for every namespace. | | `--outgoing-auth-strategy` | No | `NotSet` | Outgoing authentication strategy for service requests. Valid values: `NotSet`, `UseHostingEnvironmentIdentity`, `UseOnBehalfOf`. | | `--dangerously-write-support-logs-to-dir` | No | - | **⚠️ DANGEROUS**: Enables detailed debug-level logging for support and troubleshooting. Specify a folder path where log files will be created with timestamp-based filenames. May include sensitive information in logs. | | `--cloud` | No | `AzureCloud` | Azure cloud environment for authentication. Valid values: `AzureCloud` (default), `AzureChinaCloud`, `AzureUSGovernment`, or a custom authority host URL starting with `https://`. When a custom authority host URL is used, only the authentication authority host is changed; ARM and other service endpoints continue to use the Azure public cloud. | | `--disable-caching` | No | `false` | Disable caching of resource responses, requiring repeated requests to fetch fresh data each time. | | `--structured-output-mode` | No | Disabled | Enables `outputSchema` and `structuredContent` in `all`, `namespace`, `consolidated`, and `single` modes. `duplicated` retains the complete original `content`; `compact` returns concise `content`. Both return the complete structured result. Enable this only when the client supports these fields. | | `--disable-proxy-tools` | No | `false` | Disable tools that are proxied from sources configured in `/Resources/registry.json`. | > **⚠️ Security Warning for `--dangerously-disable-elicitation`:** > > This option disables user confirmations (elicitations) before running tools that read sensitive data. When enabled: > - Tools that handle secrets, credentials, or sensitive data will execute without user confirmation > - This removes an important security layer designed to prevent unauthorized access to sensitive information > - Only use this option in trusted, automated environments where user interaction is not possible > - Never use this option in production environments or when handling untrusted input > > **Example usage (use with caution):** > ```bash > # For automated scenarios only - bypasses security prompts > azmcp server start --dangerously-disable-elicitation > ``` > **⚠️ Security Warning for `--dangerously-disable-ssrf-protections-by-namespace`:** > > This option disables endpoint SSRF validation used by tools in the selected namespaces, including protocol, hostname allow-list, and private-network checks. When used: > - Untrusted tool input may cause requests to attacker-controlled or internal endpoints > - The values identify tool namespaces such as `acr` or `loadtesting`, not endpoint service types > - Shared ARM SDK clients use the executing command's original setup namespace in every server mode, including consolidated and single-tool mode. Their ARM policy validates every send, including direct CLI and background sends through the shared pipeline. Missing contexts and unresolved namespaces cannot enable a bypass, including `ALL`. > - Default and named factory HTTP clients use `AntiSSRFPolicy` with `ExternalOnlyLatest` to require HTTPS and block private/reserved DNS-to-IP destinations. Namespace overrides are checked on every send, including cached clients; missing or unresolved execution contexts remain protected even for `ALL`. > - Factory-created HTTP clients do not automatically follow HTTP redirects, including during namespace overrides. The shared ARM domain policy does not cover raw ARM HTTP requests or SDK clients created outside the shared ARM helper, although factory-created transports still receive DNS/IP protection. > - Repeat the option for multiple namespaces, or provide multiple space-delimited values (e.g. `--dangerously-disable-ssrf-protections-by-namespace acr loadtesting`) > - The special value `ALL` disables these protections for every namespace > - Only use this option temporarily in a fully trusted environment > > **Example usage (use with extreme caution):** > ```bash > azmcp server start \ > --dangerously-disable-ssrf-protections-by-namespace acr \ > --dangerously-disable-ssrf-protections-by-namespace loadtesting > ``` > **Security warning for outgoing proxy configuration:** > > The server selects one explicit proxy in `ALL_PROXY`, `HTTPS_PROXY`, then `HTTP_PROXY` > order and applies it to both HTTP and HTTPS requests. Requests actually routed through > that proxy omit transport-level DNS/IP checks; requests excluded by `NO_PROXY` use the > protected direct route and retain those checks. When none of those settings selects a proxy, `.NET`'s > `HttpClient.DefaultProxy` supplies environment, operating-system, PAC, and bypass rules > per destination. Requests routed through a system proxy or PAC rule omit transport DNS/IP > checks, while destinations for which those rules select no proxy retain them. PAC files > call this a `DIRECT` result. Debug recording proxies remain a handler-wide exception. > System and PAC rules are evaluated once to select a transport and again by the selected > proxy transport while connecting. If a dynamic configuration changes from proxy to direct > between those evaluations, the direct connection remains on the proxy-designated transport > and does not receive direct-route DNS/IP filtering. Use only trusted, stable proxy > configurations with appropriate network restrictions whose routing decision does not change > during a request. Endpoint validation remains active unless separately bypassed, including > public-target checks of the original destination's IPs. > **⚠️ Security Warning for `--dangerously-write-support-logs-to-dir`:** > > This option enables detailed debug-level logging that may include sensitive information such as request payloads and authentication details. When enabled: > - Log files are created in the specified directory with timestamp-based filenames (e.g., `azmcp_20251202_143052.log`) > - Logs may contain sensitive data that could be useful for support troubleshooting > - Only use this option when specifically requested by support for diagnosing issues > - Remove log files after troubleshooting is complete > > **Example usage:** > ```bash > # For support troubleshooting only > azmcp server start --dangerously-write-support-logs-to-dir /path/to/logs > ``` > **Note on `--outgoing-auth-strategy`:** > > This option controls how the server authenticates when making requests to downstream Azure services: > - `NotSet` (default): A safe default is chosen based on other settings > - `UseHostingEnvironmentIdentity`: Uses the hosting environment's identity (similar to `DefaultAzureCredential`). All outgoing requests use the same identity regardless of the incoming request's identity > - `UseOnBehalfOf`: Exchanges the incoming request's access token for a new token valid for the downstream service. Only valid when the server is running with HTTP transport and incoming HTTP authentication enabled (i.e., `--transport http` without `--dangerously-disable-http-incoming-auth`) > **Note on `--cloud`:** > > Use this option to target sovereign cloud environments: > - `AzureCloud` (default): Azure public cloud > - `AzureChinaCloud`: Azure China (operated by 21Vianet) > - `AzureUSGovernment`: Azure US Government > - Custom URL: A custom authority host URL starting with `https://` > > **Example usage:** > ```bash > # Connect to Azure US Government cloud > azmcp server start --cloud AzureUSGovernment > ``` #### Server Info ```bash # Get information about the MCP server, which includes the server's name and version. azmcp server info ``` ### Azure Data Manager for Energy Operations ```bash # Check authentication and connectivity for an ADME endpoint and data partition azmcp adme health check --endpoint \ --data-partition \ [--tenant ] \ [--auth-app-id ] # Get a schema by its fully-qualified OSDU kind azmcp adme schema get --endpoint \ --data-partition \ --kind \ [--tenant ] \ [--auth-app-id ] # List schemas with optional identity, lifecycle, scope, version, and paging filters azmcp adme schema list --endpoint \ --data-partition \ [--tenant ] \ [--auth-app-id ] \ [--authority ] \ [--source ] \ [--entity-type ] \ [--status ] \ [--scope ] \ [--schema-version-major ] \ [--schema-version-minor ] \ [--schema-version-patch ] \ [--latest-version] \ [--offset ] \ [--limit ] # Search OSDU records by kind and Lucene criteria; query pagination is the default azmcp adme search --endpoint \ --data-partition \ --kind [...] \ [--query ] \ [--limit ] \ [--cursor-pagination-mode] \ [--search-after] \ [--cursor ] \ [--offset ] \ [--returned-fields [...]] \ [--aggregate-by ] \ [--track-total-count] \ [--sort ] \ [--spatial-filter ] \ [--query-as-owner] \ [--excluded-fields [...]] \ [--highlighted-fields [...]] \ [--suggest-phrase ] \ [--tenant ] \ [--auth-app-id ] Use cursor pagination for point-in-time snapshots, bulk processing, or more than 10000 results. Supplying `--cursor` or `--search-after` also selects it; resend the original criteria on continuation requests. Cursor pagination cannot use `--offset` or `--aggregate-by`. Query pagination is the default and limits `--offset` plus `--limit` to 10000. For ADME instances registered with a customer-specific resource application, use `--auth-app-id` to set the token audience. A GUID is interpreted as `/.default`; an `api://` or `https://` App ID URI is also accepted and has `/.default` appended when needed. This is independent of `--tenant`, which selects the tenant that issues the token. # Fetch multiple records by fully-qualified OSDU record id azmcp adme storage record fetch --endpoint \ --data-partition \ --ids [...] \ [--attributes [...]] \ [--frame-of-reference] \ [--tenant ] \ [--auth-app-id ] # Get the latest or a specific version of an OSDU record, optionally projecting attributes azmcp adme storage record get --endpoint \ --data-partition \ --id \ [--version ] \ [--attributes [...]] \ [--tenant ] \ [--auth-app-id ] # List record ids for a fully-qualified OSDU kind azmcp adme storage record list --endpoint \ --data-partition \ --kind \ [--limit ] \ [--cursor ] \ [--tenant ] \ [--auth-app-id ] # List all numeric versions of an OSDU record azmcp adme storage record version list --endpoint \ --data-partition \ --id \ [--tenant ] \ [--auth-app-id ] ``` ### Azure Advisor Operations ```bash # List individual Azure Advisor recommendations and their affected-resource details. # For global recommendation metadata/catalog lookups, including service-retirement metadata by tracking ID, # use advisor metadata list instead; that command does not require a subscription. # Supports filters for category, subcategory, impact, recommendation status such as New, Postponed, # Dismissed, or Completed, recommendation type ID, # affected resource, resource type, free text, tracking ID, retirement date, and scope. # For status-filtered requests, use list to retrieve individual recommendations; use summary only # for status counts or grouped analysis. # Broad or unscoped top, critical, important, prioritized, priority, or equivalent prioritization # intent that does not identify a specific recommendation type must use summary --group-by # recommendation-type --prioritized true first. Requests that identify a specific recommendation type can use list # directly with --recommendation-type-id and --prioritized true. For other requests for individual # recommendations, use list directly with any supported filters; no prior summary call is required. # Use summary for counts, totals, rankings, distributions, or grouped analysis, not aggregates of # limited list results. After a summary, use list with --recommendation-type-id to retrieve individual # recommendations or affected resources for a selected group, preserving the applicable filters. # For a selected recommendation type, list can also order the matching individual recommendations. # # Choose subscription or Service Group scope. --resource-group applies only to subscriptions. # If neither scope is supplied, the configured default subscription is used. # Status defaults to New. --top defaults to 50 and is clamped to 1-100. # --prioritized optionally orders matching records; --show-prioritization-signals optionally # includes available signal details. Both default to false; signals require --prioritized true. # Returns recommendation records in ARM resource shape and a truncation indicator. # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp advisor recommendation list [--subscription ] \ [--resource-group ] \ [--service-group ] \ [--prioritized ] \ [--show-prioritization-signals ] \ [--top ] \ [--category ] \ [--impact ] \ [--status ] \ [--recommendation-type-id ] \ [--resource-type ] \ [--resource ] \ [--search ] \ [--sub-category ] \ [--tracking-ids ...] \ [--retirement-date :] ``` #### Recommendation list behavior | Setting | Behavior | | --- | --- | | `--prioritized false` or omitted | No explicit ordering is applied. | | `--prioritized true` | Requires `--recommendation-type-id`. Use it directly when the request identifies a specific recommendation type, or for a selected type after cross-type prioritization with recommendation summary. The selected type's metadata category determines the instance metric. Non-Cost types order by `criticalityScore` descending, treating missing scores as zero. | | Prioritized Cost drill-down | When the selected recommendation type's metadata category is Cost, converts `savings.retail.dailyPotentialSavings` to an annual value by multiplying it by 12 and 30.4, with `extendedProperties.annualSavingsAmount` as fallback. The selected annual savings score is rounded to two decimal places before ordering descending. Missing, invalid, or non-finite savings sort last; zero remains valid. | | Ordering ties | Effective retirement date ascending (instance date with metadata fallback), unknown dates last, then case-insensitive resource name ascending, then recommendation ID ascending. | | `--show-prioritization-signals true` | Requires `--prioritized true`; rejected if prioritized is false or omitted. Includes the original `properties.signalBreakdown` payload when available, preserving its backend-provided JSON shape; unavailable signals are omitted. Including signals does not change filtering or ordering. | | Result limit | ARG selects up to `top + 1` records after filtering and optional ordering. The extra record is removed and used to detect truncation. ARG truncation signals also set `areResultsTruncated`. No additional pages are fetched. | - Specify either `--subscription` or `--service-group`, not both. Supply the Service Group name segment from its ARM resource ID. - Status defaults to `New`; both listing modes also support explicit `Postponed`, `Dismissed`, and `Completed`. - Category, impact, resource type, subcategory, tracking IDs, and retirement-date filters require matching English recommendation metadata. Without these filters, records without matching metadata remain eligible. - Resource type also requires a substring match in the instance resource ID. `--resource` searches that ID, while `--search` matches the original instance problem text before metadata enrichment. Prefer structured filters when they express the request. - Tracking IDs and retirement-date filters can be combined. They imply `ServiceUpgradeAndRetirement`; an explicitly supplied subcategory must match it. - Retirement-date filtering uses the metadata date, not the effective date used for ordering. - Results are individual recommendation records, not distinct resources. Each record's `name` is its recommendation ID. - `--prioritized` orders matching list records for an explicitly identified recommendation type, whether supplied directly by the user or selected from a prior summary. Broad or unscoped prioritization intent that does not identify a specific recommendation type must route to summary with `--group-by recommendation-type --prioritized true` first. ```bash # Update the customer-provided state of an Advisor recommendation in a subscription or service group. # Use --subscription with an Azure subscription ID or name, use --service-group with a service-group ID, # or omit both to use the configured default subscription. Do not specify both. --recommendation-id # is the stable ID, also called recommendation ID. Set the state to New, Postponed, # Dismissed, or Completed. Postponed requires a future ISO 8601 date and time with a timezone offset. For Dismissed, # an omitted reason or natural-language intent that cannot be mapped to a supported reason defaults to Other. New reactivates # a postponed, dismissed, or completed recommendation. Security and platform-resolved recommendations cannot # be updated. Returns the updated recommendation in the standard ARM resource shape with id, name, type, and properties. # ✅ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp advisor recommendation update [--subscription ] \ [--service-group ] \ --recommendation-id \ --recommendation-status \ [--postponed-until-date-time ] \ [--recommendation-dismiss-reason ] \ [--tenant ] # Summarize Advisor recommendation counts, totals, rankings, and distributions in a subscription or service group, # or rank recommendation types by priority with --prioritized true. # Use --subscription with an Azure subscription ID or name, use --service-group with a service-group ID, # or omit both to use the configured default subscription. Do not specify both. # --resource-group can only be used with subscription scope. # Group by recommendation-type, category, impact, resource-type, status, sub-category, or retirement-date. # --group-by defaults to category. All groupings except status include only active New recommendations. # Recommendation-type groups return recommendation type ID GUID keys with English metadata labels. Resource-type groups use # properties.impactedField with resource-ID extraction only as a fallback. Category, impact, subcategory, and # retirement date come from recommendation-type metadata only; recommendations whose type has no English metadata are # excluded from every summary. # Retirement filters are one-sided: le: includes overdue active recommendations and is not a bounded # next-N window. # --prioritized true (top recommendations, top actions, most critical, or what-should-I-fix-first requests) ranks # active New recommendation types and defaults --top to 10. Order: metadata priority score, annual savings (daily # potential savings x 12 x 30.4, else the legacy annual amount; USD, rounded to cents), summed criticality score, # earliest retirement date, and affected-resource count (fewest first for Cost, most first otherwise), then label. # Missing values sort last and are never treated as zero. Reserved instances keep only the three-year, seven-day # lookback scenario. Each group returns its distinct affected-resource count, totalRecommendations is the sum of those # counts (affected resources per type, not records), and each group carries a prioritizationSignals object # (category, impact, subCategory, retirementDate, retirementWindow, annualSavings, resourceTypeCriticality, # criticalService, effort, actionability, costImplication) used to explain the rank in plain business language. # Drill into a type with advisor recommendation list --recommendation-type-id --prioritized true. # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp advisor recommendation summary [--subscription ] \ [--service-group ] \ [--group-by ] \ [--prioritized ] \ [--category ] \ [--impact ] \ [--recommendation-type-id ] \ [--resource-type ] \ [--resource ] \ [--search ] \ [--sub-category ] \ [--retirement-date :] \ [--top <1-100>] \ [--resource-group ] \ [--tenant ] # List the global, subscription-independent Azure Advisor recommendation metadata catalog (also called recommendation types) # from Azure Resource Graph. Use it for metadata/catalog lookups, including service-retirement metadata by Service Health # tracking ID, even when no subscription or active recommendation instance is specified. Use recommendation list for actual # subscription-scoped recommendation records. Use metadata in greenfield environments with no generated recommendations, # or filter by supported resource type during brownfield onboarding. Supports service-retirement filtering by tracking ID and retirement # date expression. Service-retirement filters apply to the ServiceUpgradeAndRetirement subcategory; conflicting # subcategory filters are rejected. Results are ordered High, Medium, Low. # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp advisor metadata list [--language ] \ [--resource-type ] \ [--impact ] \ [--category ] \ [--sub-category ] \ [--tracking-id ] \ [--retirement-date :] # Get Azure Advisor metadata for a specific recommendation type id. Explains what an Advisor # recommendation type means, including its display name, category, sub-category, impact, # supported resource type, description, potential benefits, and a learn-more documentation # link for the recommendation. # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp advisor metadata get --recommendation-type-id \ [--language ] # Fix, resolve, or remediate a specific Azure Advisor recommendation type id. Use this whenever you are asked # how to fix or how to resolve an Advisor recommendation. Returns its remediation package: # step-by-step remediation steps plus ready-to-run artifacts, scripts, and deployment templates in ARM # template, Bicep, Azure CLI, PowerShell, and terraform formats to remediate the issue. Also indicates # remediation characteristics such as whether it is destructive, reversible, or grounded, along with its # confidence, effort, and output type. # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp advisor remediation get --recommendation-type-id ``` ### Azure AI Search Operations ```bash # Get detailed properties of AI Search indexes # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp search index get --service \ [--index ] # Query AI Search index # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp search index query --service \ --index \ --query \ [--query-type ] \ [--semantic-configuration ] # Get AI Search knowledge bases (all or a specific one) # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp search knowledge base get --service [--knowledge-base ] # Run retrieval against an AI Search knowledge base # ❌ Destructive | ✅ Idempotent | ✅ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp search knowledge base retrieve --service \ --knowledge-base \ [--query ] \ [--messages ] # Get AI Search knowledge sources (all or a specific one) # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp search knowledge source get --service [--knowledge-source ] # List AI Search accounts in a subscription # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp search service list --subscription \ [--resource-group ] ``` ### Azure AI Services Speech Operations ```bash # Recognize speech from an audio file using Azure AI Services Speech # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech stt recognize --endpoint \ --file \ [--language ] \ [--phrases ] \ [--format ] \ [--profanity ] ``` #### Phrase Hints for Improved Accuracy The `--phrases` parameter supports multiple ways to specify phrase hints that improve speech recognition accuracy: **Multiple Arguments:** ```bash # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech stt recognize --endpoint --file audio.wav \ --phrases "Azure" --phrases "cognitive services" --phrases "machine learning" ``` **Comma-Separated Values:** ```bash # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech stt recognize --endpoint --file audio.wav \ --phrases "Azure, cognitive services, machine learning" ``` **Mixed Syntax:** ```bash # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech stt recognize --endpoint --file audio.wav \ --phrases "Azure, cognitive services" --phrases "machine learning" ``` Use phrase hints when you expect specific terminology, technical terms, or domain-specific vocabulary in your audio content. This significantly improves recognition accuracy for specialized content. ```bash # Synthesize speech from text and save to an audio file using Azure AI Services Speech # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech tts synthesize --endpoint \ --text \ --outputAudio \ [--language ] \ [--voice ] \ [--format ] \ [--endpointId ] ``` #### Text-to-Speech Parameters | Parameter | Required | Description | |-----------|----------|-------------| | `--endpoint` | Yes | Azure AI Services endpoint URL (e.g., `https://your-service.cognitiveservices.azure.com/`) | | `--text` | Yes | The text to convert to speech | | `--outputAudio` | Yes | Path where the synthesized audio file will be saved (e.g., output.wav, speech.mp3) | | `--language` | No | Speech synthesis language (default: en-US). Examples: es-ES, fr-FR, de-DE | | `--voice` | No | Neural voice to use (e.g., en-US-JennyNeural, es-ES-ElviraNeural). If not specified, default voice for the language is used | | `--format` | No | Output audio format (default: Riff24Khz16BitMonoPcm). Supported formats: Riff24Khz16BitMonoPcm, Audio16Khz32KBitRateMonoMp3, Audio24Khz96KBitRateMonoMp3, Ogg16Khz16BitMonoOpus, Raw16Khz16BitMonoPcm | | `--endpointId` | No | Endpoint ID of a custom voice model for personalized speech synthesis | #### Supported Audio Formats The `--format` parameter accepts the following values: - **WAV formats**: `Riff24Khz16BitMonoPcm` (default), `Riff16Khz16BitMonoPcm`, `Raw16Khz16BitMonoPcm` - **MP3 formats**: `Audio16Khz32KBitRateMonoMp3`, `Audio24Khz96KBitRateMonoMp3`, `Audio48Khz192KBitRateMonoMp3` - **OGG/Opus formats**: `Ogg16Khz16BitMonoOpus`, `Ogg24Khz16BitMonoOpus` **Examples:** ```bash # Basic text-to-speech synthesis # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech tts synthesize --endpoint https://myservice.cognitiveservices.azure.com/ \ --text "Hello, welcome to Azure AI Services Speech" \ --outputAudio welcome.wav # Synthesize with specific language and voice # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech tts synthesize --endpoint https://myservice.cognitiveservices.azure.com/ \ --text "Hola, bienvenido a los servicios de voz de Azure" \ --outputAudio spanish-greeting.wav \ --language es-ES \ --voice es-ES-ElviraNeural # Generate MP3 output with high quality # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech tts synthesize --endpoint https://myservice.cognitiveservices.azure.com/ \ --text "This is a high quality audio output" \ --outputAudio output.mp3 \ --format Audio48Khz192KBitRateMonoMp3 # Use custom voice model # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ✅ LocalRequired azmcp speech tts synthesize --endpoint https://myservice.cognitiveservices.azure.com/ \ --text "This uses my custom trained voice" \ --outputAudio custom-voice.wav \ --voice my-custom-voice-model --endpointId my-custom-voice-endpoint-id ``` ### Azure App Configuration Operations ```bash # List App Configuration stores in a subscription # ❌ Destructive | ✅ Idempotent | ❌ OpenWorld | ✅ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp appconfig account list --subscription \ [--resource-group ] # Delete a key-value setting # Returns: { key, label, existed, message } — 'existed' is true if the key was present and deleted, false if it was already absent # ✅ Destructive | ✅ Idempotent | ❌ OpenWorld | ❌ ReadOnly | ❌ Secret | ❌ LocalRequired azmcp appconfig kv delete --subscription \ --account \ --key \ [--label