Azure容器应用部署MCP服务

快速指南:在Azure容器应用中构建和部署MCP服务器,并验证其可达性。

  • by RemiBougie
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 RemiBougie/MCP-demo

使用说明

Azure容器应用程序上的MCP Hello World

构建此MCP服务器并将其部署到Azure的快速指南,然后验证它是否可访问。

这部署了什么

  • 蟒蛇 FastMCP 服务器从 server/server.py
  • 集装箱化 server/Dockerfile
  • 托管在Azure容器应用程序上,端口上有外部入口 8000

先决条件

az login

1) 设置变量

RG="mcp-rg"
LOCATION="centralus"
ACR_NAME="mcphelloworldacr2"          # must be globally unique
ENV_NAME="mcp-env"
APP_NAME="mcp-hello-world"
IMAGE_NAME="mcp-hello-world:latest"

2) 创建资源组+注册表

az group create --name "$RG" --location "$LOCATION"

az acr create \
  --resource-group "$RG" \
  --name "$ACR_NAME" \
  --sku Basic \
  --admin-enabled true

3) 构建并推送镜像(linux/amd64)

从 server 目录:

cd server

az acr login --name "$ACR_NAME"

docker build --platform linux/amd64 -t mcp-hello-world:latest .
docker tag mcp-hello-world:latest "$ACR_NAME.azurecr.io/$IMAGE_NAME"
docker push "$ACR_NAME.azurecr.io/$IMAGE_NAME"

重要提示:使用 --platform linux/amd64 以避免Azure容器应用程序映像平台错误。

4) 创建容器应用程序环境

az containerapp env create \
  --name "$ENV_NAME" \
  --resource-group "$RG" \
  --location "$LOCATION"

5) 部署容器应用程序

az containerapp create \
  --name "$APP_NAME" \
  --resource-group "$RG" \
  --environment "$ENV_NAME" \
  --image "$ACR_NAME.azurecr.io/$IMAGE_NAME" \
  --registry-server "$ACR_NAME.azurecr.io" \
  --target-port 8000 \
  --ingress external \
  --min-replicas 1 \
  --max-replicas 3 \
  --cpu 0.25 \
  --memory 0.5Gi

6) 获取URL

FQDN=$(az containerapp show \
  --name "$APP_NAME" \
  --resource-group "$RG" \
  --query properties.configuration.ingress.fqdn \
  --output tsv)

echo "https://$FQDN"

7) 验证MCP是否响应

检查端点行为:

curl -i "https://$FQDN/mcp"

预期:如果缺少标头,则会出现协议级错误(这仍然是MCP处于活动状态的好兆头)。

测试MCP初始化请求:

SESSION_ID=$(curl -sS -D - -o /dev/null \
  -H "Accept: text/event-stream" \
  "https://$FQDN/mcp" \
  | awk 'BEGIN{IGNORECASE=1} /^mcp-session-id:/ {print $2}' | tr -d '\r')

curl -sS -X POST "https://$FQDN/mcp" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "mcp-session-id: $SESSION_ID" \
  --data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl-test","version":"1.0"}}}'

预期:JSON-RPC initialize 使用服务器信息进行响应(例如 hello-world-server).

注释/陷阱

  • 如果 az acr build 在您的订阅、本地Docker构建中被阻止+ docker push 作品。
  • 根路径(/)可能会回来 404 并且仍然保持健康。
  • 在此部署中,MCP在 /mcp (不是 /sse).