🎼

Azure API Management でレガシー REST API を MCP Server として公開してみる

に公開

はじめに

Microsoft Tech Community に、下記の記事が出ていました。

とても面白そうな内容でしたので、読み解きつつ紹介したいと思います。

今回のシナリオ

元記事では、次のような前提シナリオが紹介されています。

既に Azure Container Apps (ACA) 上で稼働しているレガシー REST API がある。これを AI エージェント (GitHub Copilot Agent Mode など) から MCP 経由で呼び出したい。ただし、バックエンドを作り直したくないし、認証・スロットリング・監査はきちんと効かせたい。

そこで、下記のような流れになっています。

  1. ACA 上の Store API (サンプルの EC 用 REST API) を用意する
  2. 上記を Azure API Management で OpenAPI 定義をインポートしてプロキシ化する
  3. 上記の API を MCP Server として公開する
  4. VS Code の MCP クライアントから呼び出す

※本記事では MCP および MCP Server の概要・詳細については割愛します😌

Azure API Management の MCP Servers 機能

記事執筆時点で、Azure API Management (APIM) に MCP Server を管理する機能が追加されています。

本機能で MCP Server として公開することで、APIM が持つ認証・レート制御・ログ収集の機能を活用できるようになります。

やってみた

試した環境

  • WSL2 (Ubuntu 22.04)
  • Azure CLI v2.75

下記のコマンドを実行し、環境変数を設定しておきます。リージョンは東日本 (japaneast) としています。

RG="rg-aca-mcp-store"
LOCATION="japaneast"
ENV_NAME="mcp-store-env"
APP_NAME="mcp-store-app"
APIM_NAME="apim-mcp-store"

1. Azure Container Apps に Store API をデプロイ

元記事と同様に、サンプルとして Fake Store API のコンテナイメージを使います。

az group create -n $RG -l $LOCATION

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

az containerapp create \
  --name $APP_NAME \
  --resource-group $RG \
  --environment $ENV_NAME \
  --image voronalk/fakestoreapi:latest \
  --target-port 8080 \
  --ingress external \
  --min-replicas 1 \
  --max-replicas 5 \
  --cpu 0.5 \
  --memory 1Gi \
  --env-vars PORT=3000

FQDN を控えておきます。

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

echo "https://$CONTAINER_APP_FQDN"

上記で取得した URL は 404 が返ってきます。ブラウザで開いて /products を追加してアクセスし、それっぽい JSON が返ってくれば OK です。

2. Azure API Management インスタンスの作成

Developer SKU で APIM のインスタンスを作成します。

az apim create \
  --name $APIM_NAME \
  --resource-group $RG \
  --location $LOCATION \
  --publisher-email "admin@example.com" \
  --publisher-name "Mcp Store" \
  --sku-name Developer

ACA と比べると長い時間 (2~30分程度) がかかりますので、気長に待ちましょう☕

3. OpenAPI 定義から Store API をインポート

Fake Store API は OpenAPI 定義を公開しているので、それをそのままインポートします。

STORE_API_SPEC_URL="https://fakestoreapi.com/docs-data"

curl $STORE_API_SPEC_URL > docs-data

az apim api import \
  --resource-group $RG \
  --service-name $APIM_NAME \
  --api-id "store-api" \
  --path "/storeapp" \
  --specification-format "OpenApi" \
  --specification-path ./docs-data
  --display-name "Store API" \
  --protocols https \
  --service-url "https://$CONTAINER_APP_FQDN"

これで APIM 上に「Store API」という管理対象 API ができ、バックエンドは ACA 上のコンテナアプリ、という構成になります。

Azure Portal にて APIM のテストコンソールから Get all products などが叩ければ準備完了です。

4. Store API を MCP Server として公開

ここからが本題の MCP Server 公開です。手順は概ね下記の通りです。

  1. Azure Portal で APIM インスタンスを開く
  2. 左メニューの 「APIs」→「MCP サーバー (プレビュー)」→「MCP サーバーの作成」→「API を MCP サーバーとして公開する」 を選択
  3. Backend MCP server として、先程の Store API を選択
  4. MCP として公開したい Operation ([GET] Get all products など) を選択
  5. 名称や説明を記載
  6. 「作成」をクリック

作成が終わると、MCP Servers 一覧に

  • MCP Server 名
  • Server URL (MCP エンドポイント)

が表示されます。この MCP Server URL を控えておきます。

また、API Management での API に対するサブスクリプションキーも控えておきます。

5. Visual Studio Code から MCP Server を叩いてみる

最後に、Visual Studio Code (VS Code) から MCP Server を使えるよう設定します。詳細は、下記を参考にしてください。

設定ができたら、VS Code のチャットで次のように聞いてみて、適切な返答が返ってくれば成功です。

  • 「ストアにある商品の一覧を取得して」
  • 「価格の高い順に上位 5 件を教えて」
  • 「メンズ服だけ抽出して安い順に並べて」

バックエンド的には「従来の単なる REST API を叩いているだけ」ですが、AI 側からは「Store API 用のツール (MCP) を呼んでいる」という感覚で操作できます。

使ってみて分かったこと・ワンポイント

実際に手を動かしてみて、ポイントになりそうだと感じたところをいくつか残しておきます。

OpenAPI 定義が前提

APIM の MCP Server 機能は OpenAPI で定義された API を前提としています。OpenAPI 定義さえあれば、CLI / Portal からインポート → そのまま MCP 化、という流れに乗せやすいです。

逆に、塩漬け状態やレガシーな API だと OpenAPI 定義がないこともありますが、このタイミングで OpenAPI 定義を起こしておくのは、今後の運用的にもメリットが大きそうです。

どの Operation を利用対象とするか絞る

APIM で MCP Server を作るときに、公開する Operation を選択できます。

なんでもかんでも公開すると、「誤操作による更新系 API の実行」や「意図しないデータ流出」などのリスクが上がります。

まずは「読み取り専用 API」だけを MCP 化する、もしくは「検証用サブスクリプション」から先に試す、など段階的に進めるのが良さそうです。

認証とネットワーク境界は APIM に寄せられる

MCP 自体には、まだまだエンタープライズ向け認証の仕様は含まれておらず、実際のアクセス制御は周辺コンポーネントに委ねる形になります。

APIM を AI Gateway として噛ませることで、下記のようなガバナンスを既存の API と同じレイヤーで統一できるのがメリットですね。

  • サブスクリプションキー / Entra ID での認証
  • レート制限・IP 制限
  • Gateway ログ / Application Insights による監査

おわりに

本記事では、Azure API Management を使用して OpenAPI 準拠の定義が整備された REST API を MCP Server 化することができました。

「既に動いている REST API はそのままに、GitHub Copilot や各種 AI エージェントからツールとして安全に呼び出したい」というニーズは増えてきていると思います。

今回はガバナンス機能の細かいところまでは触れませんでしたが、そこは従来の APIM と大きく変わりは無さそうですので、タイミングを見て触っていければ (いただければ) と思います!

Discussion