Azure API Manager中MCP Server未传递POST请求体问题排查
Azure APIM MCP Server POST请求体丢失问题排查及解决
可能原因及对应解决方案
1. MCP工具定义未配置请求体映射
MCP Server不会自动将用户填写的表单参数组装成后端API需要的JSON请求体,必须在工具定义里明确配置requestTemplate,把参数映射到请求体结构中。
示例正确的工具定义片段:
"tools": [ { "name": "calculator", "description": "执行加减乘除运算", "parameters": [ { "name": "number1", "description": "第一个运算数字", "type": "integer", "required": true }, { "name": "number2", "description": "第二个运算数字", "type": "integer", "required": true } ], "requestTemplate": { "method": "POST", "url": "{{your-backend-api-url}}", "headers": { "Content-Type": "application/json" }, "body": { "number1": "{{number1}}", "number2": "{{number2}}" } } } ]
这里的{{number1}}和{{number2}}必须和parameters里定义的参数名完全一致,同时指定Content-Type确保后端能解析JSON。
2. APIM入站策略清空或篡改了请求体
如果APIM配置了入站策略,比如错误的set-body操作,会直接清空请求体。检查你的APIM策略,确保逻辑是根据MCP传递的参数生成正确的JSON请求体,而不是丢弃内容。
示例正确的入站策略(如果需要手动处理):
<policies> <inbound> <base /> <set-body>@{ var requestBody = context.Request.Body.As<JObject>(true); var number1 = requestBody["number1"]?.ToString(); var number2 = requestBody["number2"]?.ToString(); return JsonConvert.SerializeObject(new { number1 = int.Parse(number1), number2 = int.Parse(number2) }); }</set-body> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> </inbound> <!-- 其他策略 --> </policies>
如果不需要额外处理,确保没有会修改或清空请求体的策略。
3. MCP参数类型与后端API不匹配
如果MCP工具定义里的参数类型设为string,但后端API期望integer类型,可能导致参数无法正确序列化到请求体中。务必保证parameters里的type字段和后端API的请求体字段类型一致(比如integer对应数字类型)。
4. 请求头未正确设置Content-Type
即使请求体格式正确,如果没有设置Content-Type: application/json,后端API可能无法识别请求体格式,导致解析失败。在requestTemplate的headers里必须明确添加这个头。
内容的提问来源于stack exchange,提问作者Chris Hammond
相关产品推荐
相关产品推荐

