API管理MCP服务器实现

一个参考实现,用于将Azure API Management暴露为MCP服务器,使AI代理能够通过自然语言发现、查询和交互API。

  • by aundykmahesh
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 aundykmahesh/azure-apim-mcp-agent

使用说明

天蓝色apim-mcp试剂

一个参考实现,用于将Azure API管理公开为MCP(模型上下文协议)服务器,使Claude和M365 Copilot等人工智能代理能够使用自然语言发现、查询和与您的API交互-本质上是 API目录的副本.

建筑

Claude / Copilot / VS Code (MCP Client)
        |
Azure API Management (MCP Server feature)
  - Auth: subscription key + Entra ID
  - Maps REST operations -> MCP tools
        |
Azure Container Apps (Functions, scale-to-zero)
  - RESTful API endpoints
        |
Azure ARM APIs (managed identity)
  - Reads API metadata from APIM instances

APIM内置的MCP服务器功能处理MCP协议。函数应用程序是一个普通的REST API。

REST API端点

方法 路径 描述
得到 /instances 列出所有已配置的APIM实例
得到 /instances/{name}/apis 列出实例中的所有API
得到 /instances/{name}/apis/search?keyword={kw} 按关键字搜索API
得到 /instances/{name}/apis/{apiId} 获取API元数据
得到 /instances/{name}/apis/{apiId}/spec 下载OpenAPI规范
得到 /instances/{name}/apis/{apiId}/operations 列出API中的所有操作(终结点)
得到 /instances/{name}/catalog 完整目录:所有API及其操作
职位 /chat 自然语言API查询(Azure OpenAI)
得到 /health 健康检查

先决条件

本地开发

  1. 克隆仓库并还原包:
dotnet restore
  1. 在中配置您的APIM实例 src/AzureApimMcp.Functions/local.settings.json:
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
    "Apim__Instances__0__Name": "dev",
    "Apim__Instances__0__SubscriptionId": "<your-subscription-id>",
    "Apim__Instances__0__ResourceGroup": "<your-resource-group>",
    "Apim__Instances__0__ServiceName": "<your-apim-name>",
    "AzureOpenAI__Endpoint": "<your-azure-openai-endpoint>",
    "AzureOpenAI__DeploymentName": "<your-deployment-name>"
  }
}

Azure OpenAI设置是可选的。如果省略 /chat 终结点将不可用,但所有其他终结点将正常工作。

  1. 在本地运行:
cd src/AzureApimMcp.Functions
func start
  1. 测试端点:
curl http://localhost:7071/health
curl http://localhost:7071/instances
curl http://localhost:7071/instances/dev/apis
curl "http://localhost:7071/instances/dev/apis/search?keyword=payment"
curl http://localhost:7071/instances/dev/apis/my-api/operations
curl http://localhost:7071/instances/dev/catalog
curl -X POST http://localhost:7071/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "which API gives me a customer transaction history?", "sessionId": "test1"}'

部署

快速部署(推荐)

使用附带的部署脚本来构建、推送和部署所有内容:

./deploy.ps1

选项:

  • ./deploy.ps1 -SkipBuild --跳过Docker构建/推送,部署基础架构,仅重新启动
  • ./deploy.ps1 -SkipInfra --跳过二头肌部署,仅构建和重新启动

手动部署

构建并推送容器镜像

az acr login --name <acr-name>
docker build -f src/AzureApimMcp.Functions/Dockerfile -t <acr-name>.azurecr.io/apim-mcp:latest .
docker push <acr-name>.azurecr.io/apim-mcp:latest

使用二头肌部署基础设施

az deployment group create \
  --resource-group <resource-group> \
  --template-file infra/main.bicep \
  --parameters infra/main.bicepparam

更新容器应用程序

az containerapp update \
  --resource-group <resource-group> \
  --name apim-mcp-app \
  --image <acr-name>.azurecr.io/apim-mcp:latest

配置APIM MCP服务器

部署后,配置APIM以将API公开为MCP服务器:

  1. 导航到Azure门户中的APIM实例
  2. 首选 MCP服务器 在API部分
  3. 将已部署的API添加为MCP服务器
  4. 从REST操作配置MCP工具映射

添加多个APIM实例

通过环境变量添加更多实例或 local.settings.json:

{
  "Apim__Instances__0__Name": "production",
  "Apim__Instances__0__SubscriptionId": "...",
  "Apim__Instances__0__ResourceGroup": "...",
  "Apim__Instances__0__ServiceName": "...",
  "Apim__Instances__1__Name": "staging",
  "Apim__Instances__1__SubscriptionId": "...",
  "Apim__Instances__1__ResourceGroup": "...",
  "Apim__Instances__1__ServiceName": "..."
}

项目结构

src/AzureApimMcp.Functions/
  Configuration/     - Strongly-typed config models
  Services/          - IApimService + ApimService (ARM SDK)
  Functions/         - HTTP trigger functions (REST + Chat endpoints)
  Program.cs         - Host builder + DI registration
  openapi.json       - OpenAPI specification

infra/
  main.bicep         - Orchestrator
  main.bicepparam    - Parameter values
  modules/           - ACR, ACA, identity, RBAC, APIM

deploy.ps1           - Build, push, and deploy script