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

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