Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Azure APIM + MCP Server Demosearch for 'smart' products and list all current orders"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 catalogget_product_by_id- Get product details by IDsearch_products- Search products by query stringget_orders- List all orderscreate_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 |
| Backend root |
| Health check |
| Products REST API |
| Orders REST API |
| MCP endpoint (direct) |
| 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 eastus2. 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 build4. 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 zip5. 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.ps1Expected 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 devThe 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