Skip to main content
Glama
kathirt

Azure APIM + MCP Server Demo

by kathirt

Azure APIM + MCP Server Demo

This project demonstrates how to expose backend APIs through Azure API Management (APIM) as a Model Context Protocol (MCP) Server, enabling AI assistants and tools to interact with your APIs using the standardized MCP protocol.

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   MCP Client     │────▢│   Azure API Management  │────▢│   Azure App Service     β”‚
β”‚  (AI Assistant)  β”‚     β”‚      (Gateway)          β”‚     β”‚   (Express.js API)      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                         β”‚                              β”‚
        β”‚  MCP Protocol           β”‚  Subscription Key            β”‚  REST API
        β”‚  (JSON-RPC 2.0)         β”‚  Rate Limiting               β”‚  Products/Orders
        β”‚                         β”‚  Monitoring                  β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“¦ Components

Backend API (backend-api/)

  • Express.js application with TypeScript

  • REST API endpoints for products and orders

  • MCP JSON-RPC endpoint handler

  • 5 MCP tools:

    • get_products - List all products in the catalog

    • get_product_by_id - Get product details by ID

    • search_products - Search products by query string

    • get_orders - List all orders

    • create_order - Create a new order

Infrastructure (infrastructure/)

  • Bicep templates for Azure deployment

  • Azure App Service (Linux, Node.js 20 LTS, B1 Basic)

  • Azure API Management (Developer SKU)

  • Application Insights for monitoring

  • Log Analytics workspace

🌐 Endpoints

Endpoint

Description

https://apimmcp-api-dev.azurewebsites.net/

Backend root

https://apimmcp-api-dev.azurewebsites.net/api/health

Health check

https://apimmcp-api-dev.azurewebsites.net/api/products

Products REST API

https://apimmcp-api-dev.azurewebsites.net/api/orders

Orders REST API

https://apimmcp-api-dev.azurewebsites.net/api/mcp

MCP endpoint (direct)

https://apimmcp-apim-dev.azure-api.net/mcp

MCP endpoint (via APIM) ⭐

πŸ“‘ MCP Protocol

The server implements the Model Context Protocol (version 2024-11-05):

Initialize

{
  "jsonrpc": "2.0",
  "method": "initialize",
  "id": 1,
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": { "name": "client", "version": "1.0.0" }
  }
}

List Tools

{
  "jsonrpc": "2.0",
  "method": "tools/list",
  "id": 2
}

Call Tool

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "id": 3,
  "params": {
    "name": "get_products"
  }
}

Example: Search Products

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "id": 4,
  "params": {
    "name": "search_products",
    "arguments": { "query": "smart" }
  }
}

Example: Create Order

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "id": 5,
  "params": {
    "name": "create_order",
    "arguments": { "productId": "prod-001", "quantity": 2 }
  }
}

πŸš€ Deployment

Prerequisites

  • Azure CLI installed and logged in

  • Azure subscription

  • Node.js 18+ installed locally

1. Create Resource Group

az group create --name apim-mcp-demo-rg --location eastus

2. Deploy Infrastructure

az deployment group create `
  --resource-group apim-mcp-demo-rg `
  --template-file ./infrastructure/main-appservice.bicep `
  --parameters location=eastus namePrefix=apimmcp environment=dev apimPublisherEmail="your-email@example.com"

⚠️ Note: APIM provisioning takes 15-30 minutes on first deployment.

3. Build Backend API

cd backend-api
npm install
npm run build

4. Deploy Backend API

Compress-Archive -Path "dist\*", "package.json", "web.config", "node_modules" -DestinationPath "deploy.zip" -Force
az webapp deploy --resource-group apim-mcp-demo-rg --name apimmcp-api-dev --src-path deploy.zip --type zip

5. Get APIM Subscription Key

az rest --method post `
  --uri "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/apim-mcp-demo-rg/providers/Microsoft.ApiManagement/service/apimmcp-apim-dev/subscriptions/mcp-subscription/listSecrets?api-version=2022-08-01" `
  --query "primaryKey" -o tsv

πŸ§ͺ Testing

Run Test Script

.\test-mcp.ps1

Expected Output

========================================
  MCP Server Test Suite
========================================

Endpoint: https://apimmcp-apim-dev.azure-api.net/mcp

1. Testing initialize...
   Server: azure-product-catalog-server v1.0.0
   Protocol: 2024-11-05

2. Testing tools/list...
   Found 5 tools:
     - get_products: Retrieve a list of all products in the catalog
     - get_product_by_id: Get details of a specific product by its ID
     ...

3. Testing tools/call (get_products)...
   Found 8 products:
     - Widget Pro: $29.99
     - Gadget Plus: $49.99
     ...

Manual Testing

$headers = @{
  "Ocp-Apim-Subscription-Key" = "YOUR_SUBSCRIPTION_KEY"
  "Content-Type" = "application/json"
}

$body = '{"jsonrpc":"2.0","method":"initialize","id":1,"params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'

Invoke-RestMethod -Uri "https://apimmcp-apim-dev.azure-api.net/mcp" -Method POST -Headers $headers -Body $body

πŸ› οΈ Development

Local Development

cd backend-api
npm install
npm run dev

The server will start on http://localhost:3000.

Project Structure

APIM-MCP/
β”œβ”€β”€ backend-api/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ index.ts      # Express server entry
β”‚   β”‚   β”œβ”€β”€ routes.ts     # REST API routes
β”‚   β”‚   β”œβ”€β”€ mcp.ts        # MCP endpoint handler
β”‚   β”‚   └── data.ts       # Mock data store
β”‚   β”œβ”€β”€ dist/             # Compiled JavaScript
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ tsconfig.json
β”‚   └── web.config        # IIS configuration for Azure
β”œβ”€β”€ infrastructure/
β”‚   └── main-appservice.bicep   # Azure resources
β”œβ”€β”€ test-mcp.ps1          # Test script
└── README.md

πŸ”§ Configuration

APIM Settings

  • Subscription Required: Yes

  • Rate Limiting: Configurable via APIM policies

  • Authentication: Subscription key header (Ocp-Apim-Subscription-Key)

App Service Settings

  • SKU: B1 Basic (Linux)

  • Node Version: 20 LTS

  • Startup Command: node index.js

πŸ“Š Monitoring

  • Application Insights integrated with both App Service and APIM

  • Access logs in Log Analytics workspace

  • Health endpoint available at /api/health

πŸ”— Resources

πŸ“„ License

MIT

-
security - not tested
A
license - permissive license
-
quality - not tested

Resources

Looking for Admin?

Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kathirt/APIM-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server