Skip to content

Commit 016ee16

Browse files
Update MCP service comparison to include Azure Kubernetes Service (AKS) and revise hosting options overview
1 parent 0862669 commit 016ee16

1 file changed

Lines changed: 41 additions & 15 deletions

File tree

articles/container-apps/mcp-choosing-azure-service.md

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
---
22
title: Choose an Azure service for your MCP server
3-
description: Compare Azure Container Apps, App Service, and Azure Functions for hosting MCP servers and pick the best fit for your workload.
3+
description: Compare Azure Container Apps, App Service, Azure Functions, and Azure Kubernetes Service (AKS) for hosting MCP servers and pick the best fit for your workload.
44
#customer intent: As a developer, I want to understand how Azure hosting options compare for MCP servers so that I can pick the right service for my workload.
55
ms.topic: product-comparison
66
ms.service: azure-container-apps
77
ms.collection: ce-skilling-ai-copilot
88
ms.custom: cross-service
9-
ms.date: 02/19/2026
9+
ms.date: 03/26/2026
1010
author: craigshoemaker
1111
ms.author: cshoe
1212
ms.reviewer: cshoe
@@ -21,7 +21,7 @@ You can use several Azure services to host Model Context Protocol (MCP) servers.
2121
2222
## Hosting options overview
2323

24-
Azure provides four ways to host an MCP server. Each option targets a different mix of flexibility, simplicity, and isolation.
24+
Azure provides five ways to host an MCP server. Each option targets a different mix of flexibility, simplicity, and isolation.
2525

2626
### Azure Container Apps (standalone)
2727

@@ -39,22 +39,29 @@ Add an MCP endpoint to an existing or new web app. App Service supports code-bas
3939

4040
Map function triggers to MCP tools by using the [Azure Functions MCP extension](/azure/azure-functions/scenario-custom-remote-mcp-server). Azure Functions is optimized for stateless, event-driven tool execution with per-invocation pricing.
4141

42+
### Azure Kubernetes Service (AKS)
43+
44+
Deploy MCP servers as standard Kubernetes Deployments with HTTP ingress. AKS gives you full access to the Kubernetes API, so you can use Helm charts, custom networking (CNI, network policies), service mesh, GPU node pools, and [KEDA](/azure/aks/keda-about)-based autoscaling. Choose AKS when your team already manages a Kubernetes cluster or needs capabilities that go beyond what a managed container platform provides.
45+
46+
> [!NOTE]
47+
> Container Apps is built on Kubernetes and provides a managed experience with less operational overhead. If you need direct Kubernetes API access, custom operators, or have an existing AKS investment, use AKS directly. For a broader comparison between these services, see [Comparing Container Apps with other Azure container options](compare-options.md).
48+
4249
## Compare hosting options
4350

4451
The following table summarizes the key differences between hosting options.
4552

46-
| Consideration | Container Apps (standalone) | Container Apps (sessions) | App Service | Azure Functions |
47-
|---|---|---|---|---|
48-
| **Custom tools** | Yes | No (platform-defined only) | Yes | Yes |
49-
| **Language support** | Any (containerized) | Python and shell only | .NET, Python, Node.js, Java | .NET, Python, Node.js, Java |
50-
| **MCP transport** | Streamable HTTP | JSON-RPC over HTTP | Streamable HTTP | MCP extension or self-hosted |
51-
| **Authentication** | Built-in auth (Microsoft Entra ID) or custom | API key (`x-ms-apikey`) | App Service auth (Microsoft Entra ID) | Function keys or Microsoft Entra ID |
52-
| **Isolation** | Container-level | Hyper-V per session | App-level | Function-level |
53-
| **Scaling** | Revision autoscale, scale-to-zero | Per-session, pool-managed | App Service Plan | Consumption or Premium plan |
54-
| **Cold start** | Yes (mitigate with min replicas) | Subsecond (prewarmed pool) | Depends on plan | Yes (Consumption plan) |
55-
| **Microservices** | Native (environments, Dapr) | No | Limited | Limited |
56-
| **Operational overhead** | Medium (Dockerfile, registry) | Low (platform-managed) | Low (code deployment) | Low (function deployment) |
57-
| **Pricing model** | Per vCPU-second, per GiB-second | Per session (consumption) | App Service Plan | Per execution |
53+
| Consideration | Container Apps (standalone) | Container Apps (sessions) | App Service | Azure Functions | AKS |
54+
|---|---|---|---|---|---|
55+
| **Custom tools** | Yes | No (platform-defined only) | Yes | Yes | Yes |
56+
| **Language support** | Any (containerized) | Python and shell only | .NET, Python, Node.js, Java | .NET, Python, Node.js, Java | Any (containerized) |
57+
| **MCP transport** | Streamable HTTP | JSON-RPC over HTTP | Streamable HTTP | MCP extension or self-hosted | Streamable HTTP |
58+
| **Authentication** | Built-in auth (Microsoft Entra ID) or custom | API key (`x-ms-apikey`) | App Service auth (Microsoft Entra ID) | Function keys or Microsoft Entra ID | Microsoft Entra Workload Identity or custom |
59+
| **Isolation** | Container-level | Hyper-V per session | App-level | Function-level | Pod and namespace-level |
60+
| **Scaling** | Revision autoscale, scale-to-zero | Per-session, pool-managed | App Service Plan | Consumption or Premium plan | HPA, KEDA, Cluster Autoscaler |
61+
| **Cold start** | Yes (mitigate with min replicas) | Subsecond (prewarmed pool) | Depends on plan | Yes (Consumption plan) | No (pods always running), or Yes with KEDA scale-to-zero |
62+
| **Microservices** | Native (environments, Dapr) | No | Limited | Limited | Native (Kubernetes service discovery, service mesh) |
63+
| **Operational overhead** | Medium (Dockerfile, registry) | Low (platform-managed) | Low (code deployment) | Low (function deployment) | High (cluster management, upgrades, networking) |
64+
| **Pricing model** | Per vCPU-second, per GiB-second | Per session (consumption) | App Service Plan | Per execution | Per node (VM cost) + managed cluster fee |
5865

5966
## Choose by scenario
6067

@@ -122,6 +129,21 @@ For interactive MCP clients, use a Functions Premium plan to avoid cold-start la
122129

123130
Container Apps environments support internal service discovery, Dapr sidecars, and managed identities for service-to-service calls. Deploy multiple MCP servers as separate container apps within the same environment and let them communicate securely without exposing internal endpoints to the internet. Container Apps gives you full control over the runtime and dependencies for each server, but you manage a Dockerfile and container images for each one.
124131

132+
### Host MCP servers on an existing AKS cluster
133+
134+
**Recommended: Azure Kubernetes Service (AKS)**
135+
136+
If your team already manages an AKS cluster, deploy MCP servers as Kubernetes Deployments with a Service and Ingress resource. AKS is a good fit when:
137+
138+
- You already run AI workloads on AKS and want to colocate MCP servers on the same cluster.
139+
- You need GPU node pools for AI models running alongside your MCP servers.
140+
- You require custom Kubernetes networking, such as Azure CNI, network policies, or a service mesh.
141+
- You want [KEDA](/azure/aks/keda-about)-based autoscaling with fine-grained control over scaling triggers.
142+
143+
Use a standard Kubernetes Ingress controller (such as NGINX, Azure Application Gateway Ingress Controller, or Istio gateway) to expose your MCP server's streamable HTTP endpoint. Secure the endpoint with [Microsoft Entra Workload Identity](/azure/aks/workload-identity-overview) for service-to-service calls or custom authentication middleware.
144+
145+
For a hybrid scenario where you want the Container Apps managed experience on your own Kubernetes infrastructure, see [Azure Container Apps on Azure Arc](azure-arc-overview.md).
146+
125147
## Quick decision guide
126148

127149
Use these questions to narrow your choice:
@@ -130,6 +152,7 @@ Use these questions to narrow your choice:
130152
1. **Do you already have a web app running on App Service?** Add MCP to your existing Azure App Service app.
131153
1. **Do you need event-driven, per-invocation tool execution?** Use Azure Functions.
132154
1. **Do you need full container control, custom languages, or a microservices architecture?** Use Azure Container Apps (standalone).
155+
1. **Do you already run workloads on AKS and need full Kubernetes API access?** Use Azure Kubernetes Service (AKS).
133156
1. **Not sure where to start?** Begin with Azure Container Apps (standalone), which is the most flexible default.
134157

135158
## Related content
@@ -140,3 +163,6 @@ Use these questions to narrow your choice:
140163
- [Azure App Service overview](/azure/app-service/overview)
141164
- [Azure Functions overview](/azure/azure-functions/functions-overview)
142165
- [Connect an MCP server on Azure Functions to a Foundry Agent Service agent](/azure/azure-functions/functions-mcp-foundry-tools)
166+
- [Azure Kubernetes Service (AKS) overview](/azure/aks/intro-kubernetes)
167+
- [KEDA add-on for AKS](/azure/aks/keda-about)
168+
- [Microsoft Entra Workload Identity on AKS](/azure/aks/workload-identity-overview)

0 commit comments

Comments
 (0)