MCP模版配置手册
Nacos MCP 存量服务模版配置
在添加tool的时候通过协议转化配置配置网关的模版
模版配置说明
模版是一个 JSON 配置,包含以下字段:
| 字段 | 说明 |
|---|---|
| requestTemplate | 请求参数模版 |
| argsPosition | 参数位置映射 |
| responseTemplate | 返回体模版 |
| errorResponseTemplate | 错误返回体模版(当 HTTP 状态码为非 2xx 时生效) |
上手指南
- 定义请求:在 requestTemplate 中设置 url、method,必要时补充 headers。请求体/查询串的批量处理方式四选一:body | argsToJsonBody | argsToFormBody | argsToUrlParam(互斥)。
- 放置参数:使用 argsPosition 为每个参数声明位置 query/path/header/cookie/body;并在 url/headers/body 中通过 {{ .args.
}} 引用这些参数。已显式声明位置的参数不会再参与批量处理。 - 整理返回:在 responseTemplate 中用 body/prependBody/appendBody 组织输出。
- 定制错误:如需在非 2xx 状态时自定义返回格式,配置 errorResponseTemplate(可读取 _headers 与响应体内容)。
提示:先实现最小可用(仅配置 url、method、argsToUrlParam),联通后逐步细化 headers、body 与响应内容。
请求参数模版(requestTemplate)
常用字段(依据 REST-to-MCP 工具配置定义):
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| url | string | 是 | - | 请求 URL 模版,支持变量插值 |
| method | string | 是 | - | HTTP 方法(GET/POST 等) |
| headers | array | 否 | [] | 请求头模版;元素包含 key、value 两项,value 支持插值 |
| headers[].key | string | 是 | - | 请求头名称 |
| headers[].value | string | 是 | - | 请求头值模版 |
| body | string | 否 | - | 请求体模版;与 argsToJsonBody/argsToUrlParam/argsToFormBody 互斥(配置了 body 时,将忽略 position: body 的参数以避免冲突) |
| argsToJsonBody | boolean | 否 | false | 为 true 时,未指定位置的参数将直接作为 JSON 请求体发送,并自动补充 Content-Type: application/json; charset=utf-8;与 body/argsToUrlParam/argsToFormBody 互斥 |
| argsToUrlParam | boolean | 否 | false | 为 true 时,未指定位置的参数将作为查询参数追加到 URL;与 body/argsToJsonBody/argsToFormBody 互斥 |
| argsToFormBody | boolean | 否 | false | 为 true 时,未指定位置的参数以 application/x-www-form-urlencoded 放入请求体,并自动补充对应的 Content-Type;与 body/argsToJsonBody/argsToUrlParam 互斥 |
| security | object | 否 | - | 请求到 REST API 的认证配置 |
| security.id | string | 当配置 security 时必填 | - | 引用 server.securitySchemes 中的认证方案 ID |
| security.credential | string | 否 | - | 覆盖 server.securitySchemes 的默认凭证;开启 tools[].security.passthrough 时将被忽略 |
可用变量与插值:
| 名称 | 说明 | 示例 |
|---|---|---|
| 工具参数 | 通过 .args. | Authorization: Bearer {{ .args.token }} |
| Nacos 引用 | 可引用同命名空间的配置 | key={{ ${nacos.appKey/amap}.data }} |
易错提醒:
- 批量选项四选一:body、argsToJsonBody、argsToUrlParam、argsToFormBody 互斥,只能选择其一。
- 使用 body 写 JSON 时需正确转义引号;结构复杂时可改用 argsToJsonBody(以参数直接构成 JSON)。
- 当参数已通过 argsPosition 显式声明位置(query/path/header/cookie/body)时,这些参数不会再参与批量选项;只有未声明位置的参数才会受 argsTo* 影响。
- 当 requestTemplate.body 已设置时,所有 position: body 的参数将被忽略,以避免与自定义 body 冲突。 示例见文末“示例汇总”。
提示:当已在 argsPosition 指定了参数位置(如 path/header/body),对应参数不会再被 argsToUrlParam 自动拼到查询串中。
参数位置信息(argsPosition)
使用 argsPosition 指定每个参数在 HTTP 请求中的位置(与 Higress 文档中的 args[].position 语义一致)。
| 取值 | 注入位置 | 说明 |
|---|---|---|
| query | 查询参数 | 追加到 URL 查询串中 |
| path | 路径参数 | 用于占位替换,如 /users/{{ userId }} |
| header | 请求头 | 注入到 HTTP Header,如 X-Trace-Id |
| cookie | Cookie | 注入到 Cookie 中 |
| body | 请求体 | 注入到请求体(若 requestTemplate.body 已设置,则此位置的参数被忽略) |
使用要点:
- path:必须在 url 中存在对应占位符(例如 /users/{{ userId }})。
- header:在 requestTemplate.headers 数组中添加 {key、value},并在 value 中引用参数(例如 {“key”:“X-Trace-Id”,“value”:”{{ .args.traceId }}”})。
- cookie:默认以参数名作为 Cookie 名;如需自定义,可在 headers 数组中添加 {key:“Cookie”, value:“sessionId={{ .args.sessionId }}”}。
- query:若已显式声明到其他位置,则不会再被 argsToUrlParam 追加到查询串。
与批量参数选项的关系:
- 指定为 query/path/header/cookie/body 的参数,将按照所声明位置处理,不受 argsToJsonBody/argsToUrlParam/argsToFormBody 影响。
- 未声明位置的参数,才会被相应的批量选项处理。
- 若 requestTemplate.body 明确指定了请求体,则忽略 position: body 的参数,避免冲突。
示例见文末“示例汇总”。
返回体模版(responseTemplate)
常用字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| body | string | 否 | 直接作为最终响应体输出(与 prependBody/appendBody 互斥) |
| prependBody | string | 否 | 在原始响应体前追加文本(与 body 互斥) |
| appendBody | string | 否 | 在原始响应体后追加文本(与 body 互斥) |
建议:
- 若上游响应结构复杂,建议仅输出必要字段,避免直接透传冗长内容。
- 如需保留上游原始 JSON,同时补充上下文说明,可使用 prependBody/appendBody。
提示:对于非 2xx 的错误响应,可通过 errorResponseTemplate 定制错误返回内容,覆盖 responseTemplate 的行为。
示例见文末“示例汇总”。
错误返回体模版(errorResponseTemplate)
errorResponseTemplate 用于在上游 HTTP 响应状态码不在 [200, 300) 区间时渲染返回(即 <200 或 ≥300)。配置后,将优先使用该模板对错误响应进行改写(不再使用 responseTemplate)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| errorResponseTemplate | string | 否 | 错误响应渲染模板;仅在非 2xx 状态触发 |
可用变量与上下文(与 responseTemplate 基本一致,另补充特殊头部访问方式):
- JSON 字段:若响应体为 JSON,可直接取顶层字段,或使用 gjson 进行查询(如 {{ .error.message }} 或 {{ gjson “data.items.#.name” }})
- 读取响应头:通过特殊 Map _headers 配合 gjson 访问任意响应头值,例如:
- {{ gjson “_headers.\” }} 获取 HTTP 状态码(注意 需使用反斜杠转义)
- {{ gjson “_headers.x-ca-error-code” }} 获取名为 x-ca-error-code 的响应头值
注意:
- 仅在 HTTP 状态码非 2xx 时生效;正常 2xx 响应仍由 responseTemplate 渲染。
- 若未配置 errorResponseTemplate,将使用网关/上游的默认错误响应(通常为原样透传)。
示例(提取状态码与错误码并回显部分原文):
{ "errorResponseTemplate": "statusCode: {{ gjson \"_headers.\\\\:status\" }}\nerrorCode: {{ gjson \"_headers.x-ca-error-code\" }}\nraw: {{.data.value}}"}模板语法
REST-to-MCP 使用 GJSON Template 引擎渲染模版(Go Template + GJSON 路径查询)。它内置了 Helm/Sprig 常用函数集,便于进行字符串处理、数值运算、日期格式化、结构遍历与条件控制等。
参考:
- GJSON Template: https://github.com/higress-group/gjson_template
- GJSON 路径语法: https://github.com/tidwall/gjson#path-syntax
- Helm/Sprig 函数列表: https://helm.sh/docs/chart_template_guide/function_list/
请求模板
用于构造 HTTP 请求的 URL、Header 与 Body:
- 访问工具参数:
.args.<name>(例如:{{ .args.userId }})。 - 常用函数:
- 序列化与编码:
toJson、toPrettyJson、toRawJson、urlquery、urlqueryescape、b64enc、b64dec。 - 容错与默认:
default、empty、coalesce、ternary。 - 日期时间:
now、date、dateInZone、dateModify。
- 序列化与编码:
示例片段:
{ "requestTemplate": { "url": "https://api.example.com/users/{{ .args.userId }}", "method": "GET", "headers": [ { "key": "Authorization", "value": "Bearer {{ .args.apiKey }}" } ] }}响应模板
用于将上游 HTTP 响应改写成适合 AI 消费的文本:
- 直接取 JSON 字段:
{{ .data.items }},或使用gjson进行复杂查询。 - 可用控制结构与函数(部分):
- 字符串:
trim、upper、lower、replace、nospace。 - 数学:
add、sub、mul、div、max、min。 - 列表:
list、first、last、uniq、sortAlpha。 - 字典:
dict、get、set、hasKey、pluck。 - 流程:
if、range、with、ternary、default、coalesce。 - 类型与格式:
toString、toJson、toPrettyJson、toRawJson。 - 其他:
uuidv4等。
- 字符串:
示例片段:
{ "responseTemplate": { "body": "{{- range $i, $u := .users }}\n- {{ add $i 1 }}. {{ $u.name }} ({{ $u.id }})\n{{- end }}" }}GJSON 路径语法要点
常用选择器:
- 点表示法:
address.city - 数组下标:
users.0.name - 数组迭代:
users.#.name - 条件过滤:
users.#(age>=30)#.name - 修饰符:
users.@reverse.#.name - 多路径:
{name:users.0.name,count:users.#} - 转义:
path.with\.dot
配合 gjson 函数的示例:
活跃用户:{{ gjson "users.#(active==true)#.name" }}倒序用户名:{{ gjson "users.@reverse.#.name" }}{{- /* 迭代过滤结果 */ -}}管理员:{{- range $u := gjson "users.#(roles.#(==admin)>0)#" }} - {{ $u.name }} ({{ $u.age }}){{- end }}在模版中直接引用nacos配置
可以在模版中直接引用同命名空间下的nacos配置,作为模版的值,引用的语法为${nacos.dataId/group}
| 能力 | 用法 | 说明 |
|---|---|---|
| 基本引用 | ${nacos.dataId/group} | 取配置整体内容(字符串或 JSON 文本) |
| JSON 属性 | {{ ${nacos.dataId/group}.key }} | 配置为 JSON 时,可点取属性 |
| 组合插值 | ?k={{ ${nacos.appKey/amap}.data }} | 与请求路径、查询参数、头、体结合使用 |
例如要引用的配置的dataid 为 appCode, 分组为 data,则模版中nacos配置引用的写法为${nacos.appCode/data}
如果配置本身是json格式,则可以使用jsonpath引用配置中具体的json object的属性值,例如 appCode/data 的值为 {"a": "b"}则可以通过 {{ ${nacos.appCode/data}.a }} 引用appCode中的a的值 b
如果配置本身不是json格式,则会将整个配置的值作为string填充到引用处。
例如对amap的key进行引用,首先创建一个配置存储amap的key,例如存储在 dataId 为appKey, 分组为amap的配置中,配置内容为 {"data": "xxxx"},示例见文末“示例汇总”。
注意:
- 引用不存在的配置会导致渲染失败或得到空值,请确保 dataId/group 正确并已发布。
- JSONPath 取值仅支持点语法的简单属性访问(如 .a、.a.b),不建议在模版中做复杂逻辑。
- 敏感信息(如密钥)建议以 Nacos 引用注入,不要硬编码在仓库。
示例:引用 AMap Key
{ "data": "xxxx-your-amap-key"}{ "requestTemplate": { "url": "/v3/weather/weatherInfo?key={{ ${nacos.appKey/amap}.data }}", "method": "GET", "argsToUrlParam": true }}完整示例(串联 requestTemplate/argsPosition/responseTemplate)
{ "requestTemplate": { "url": "/users/{{ userId }}/orders?lang={{ .args.lang }}&key={{ ${nacos.appKey/amap}.data }}", "method": "GET" }, "argsPosition": { "userId": "path", "lang": "query", "traceId": "header" }, "responseTemplate": { "body": "用户:{{ .user.name }} 订单数:{{ len .orders }} " }}示例汇总
请求模版示例
使用 argsToUrlParam 将未映射到 path/header/body/cookie 的参数自动追加到 URL 查询串,适合简单 GET 接口。
{ "requestTemplate": { "url": "/v3/weather/weatherInfo", "argsToUrlParam": true, "method": "GET" }}同时演示路径占位替换、请求头注入,以及从 Nacos 读取 key 并拼入查询参数。
{ "requestTemplate": { "url": "/users/{{ .args.userId }}/detail?lang={{ .args.lang }}&key={{ ${nacos.appKey/amap}.data }}", "method": "GET", "headers": [ { "key": "X-Trace-Id", "value": "{{ .args.traceId }}" } ] }}对应 Nacos 配置(appKey/amap):
{ "data": "xxxx-your-amap-key"}通过 body 直接构造 JSON 请求体(与 argsToJsonBody/argsToFormBody/argsToUrlParam 互斥)。
{ "requestTemplate": { "url": "/api/order/create", "method": "POST", "body": "{ \"productId\": \"{{ .args.productId }}\", \"count\": {{ .args.count }}, \"extra\": { \"note\": \"{{ .args.note }}\" } }" }}参数位置信息示例
把 city 放到查询参数中,最终会以 ?city=xxx 形式出现在 URL 上。
{ "requestTemplate": { "url": "/v3/weather/weatherInfo", "argsToUrlParam": true, "method": "GET" }, "argsPosition": { "city": "query" }}把 userId 用于路径占位替换(/users/{{ userId }}/detail -> /users/123/detail)。
{ "requestTemplate": { "url": "/users/{{ userId }}/detail", "method": "GET" }, "argsPosition": { "userId": "path" }}将 traceId 注入到请求头 X-Trace-Id 中,用于链路追踪。
{ "requestTemplate": { "url": "/orders", "method": "GET" }, "argsPosition": { "traceId": "header" }}把 sessionId 注入到 Cookie,用于会话识别(如需自定义 Cookie 串可手工组织 headers 中的 Cookie)。
{ "requestTemplate": { "url": "/profile", "method": "GET" }, "argsPosition": { "sessionId": "cookie" }}把多个参数注入请求体,适合 POST/PUT 等需要提交数据的场景。
{ "requestTemplate": { "url": "/api/order/create", "method": "POST" }, "argsPosition": { "productId": "body", "count": "body", "note": "body" }}响应模版示例
从 JSON 响应中直接取字段 city/weather/temp,组合为一行文字返回。
{ "responseTemplate": { "body": "城市:{{ .city }} 天气:{{ .weather }} 温度:{{ .temp }}℃" }}通过 prependBody/appendBody 在保留原始响应的同时增加上下文说明。
{ "responseTemplate": { "prependBody": "# 查询结果\n以下为原始 JSON:\n", "appendBody": "\n---\n以上为原始返回体,供进一步处理。" }}错误响应模版示例
用于在上游返回非 2xx 状态时,提取状态码与错误头信息并回显部分原始内容。
{ "errorResponseTemplate": "statusCode: {{ gjson \"_headers.\\:status\" }}\nerrorCode: {{ gjson \"_headers.x-ca-error-code\" }}\nraw: {{.data.value}}"}Nacos 引用示例
从 Nacos 读取 appKey(amap)并作为 key 查询参数拼入 URL。
{ "data": "xxxx-your-amap-key"}{ "requestTemplate": { "url": "/v3/weather/weatherInfo?key={{ ${nacos.appKey/amap}.data }}", "argsToUrlParam": true, "method": "GET" }, "responseTemplate": { "body": "response value {{ .value }}" }}完整示例(串联 requestTemplate/argsPosition/responseTemplate)
把请求模版、参数位置与响应模版串起来,展示一次完整的请求-响应改写流程。
{ "requestTemplate": { "url": "/users/{{ userId }}/orders?key={{ ${nacos.appKey/amap}.data }}", "method": "GET" }, "argsPosition": { "userId": "path", "lang": "query", "traceId": "header" }, "responseTemplate": { "body": "用户:{{ .user.name }} 订单数:{{ len .orders }}" }}对应 Nacos 配置(appKey/amap):
{ "data": "xxxx-your-amap-key"}