[{"data":1,"prerenderedAt":5956},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-tools":139,"-core-concepts-tools-surround":5951},[4,40,65,110],{"title":5,"path":6,"stem":7,"children":8,"page":39},"入门指南","\u002Fgetting-started","1.getting-started",[9,14,19,24,29,34],{"title":10,"path":11,"stem":12,"icon":13},"简介","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":15,"path":16,"stem":17,"icon":18},"安装","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"配置","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F3.configuration","i-lucide-settings",{"title":25,"path":26,"stem":27,"icon":28},"MCP Inspector","\u002Fgetting-started\u002Finspector","1.getting-started\u002F4.inspector","i-lucide-circuit-board",{"title":30,"path":31,"stem":32,"icon":33},"连接","\u002Fgetting-started\u002Fconnection","1.getting-started\u002F5.connection","i-lucide-plug",{"title":35,"path":36,"stem":37,"icon":38},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F6.agent-skills","i-lucide-sparkles",false,{"title":41,"path":42,"stem":43,"children":44,"page":39},"核心概念","\u002Fcore-concepts","2.core-concepts",[45,50,55,60],{"title":46,"path":47,"stem":48,"icon":49},"工具","\u002Fcore-concepts\u002Ftools","2.core-concepts\u002F2.tools","i-lucide-wrench",{"title":51,"path":52,"stem":53,"icon":54},"资源","\u002Fcore-concepts\u002Fresources","2.core-concepts\u002F3.resources","i-lucide-package",{"title":56,"path":57,"stem":58,"icon":59},"提示词 (Prompts)","\u002Fcore-concepts\u002Fprompts","2.core-concepts\u002F4.prompts","i-lucide-message-square",{"title":61,"path":62,"stem":63,"icon":64},"处理器 (Handlers)","\u002Fcore-concepts\u002Fhandlers","2.core-concepts\u002F5.handlers","i-lucide-server",{"title":66,"path":67,"stem":68,"children":69,"page":39},"进阶主题","\u002Fadvanced","3.advanced",[70,75,80,85,90,95,100,105],{"title":71,"path":72,"stem":73,"icon":74},"自定义路径","\u002Fadvanced\u002Fcustom-paths","3.advanced\u002F1.custom-paths","i-lucide-folder",{"title":76,"path":77,"stem":78,"icon":79},"中间件","\u002Fadvanced\u002Fmiddleware","3.advanced\u002F2.middleware","i-lucide-shield",{"title":81,"path":82,"stem":83,"icon":84},"TypeScript","\u002Fadvanced\u002Ftypescript","3.advanced\u002F3.typescript","i-lucide-type",{"title":86,"path":87,"stem":88,"icon":89},"钩子","\u002Fadvanced\u002Fhooks","3.advanced\u002F4.hooks","i-lucide-webhook",{"title":91,"path":92,"stem":93,"icon":94},"MCP 评估","\u002Fadvanced\u002Fevals","3.advanced\u002F5.evals","i-lucide-flask-conical",{"title":96,"path":97,"stem":98,"icon":99},"会话 (Sessions)","\u002Fadvanced\u002Fsessions","3.advanced\u002F6.sessions","i-lucide-database",{"title":101,"path":102,"stem":103,"icon":104},"动态定义","\u002Fadvanced\u002Fdynamic-definitions","3.advanced\u002F7.dynamic-definitions","i-lucide-toggle-right",{"title":106,"path":107,"stem":108,"icon":109},"代码模式 (Code Mode)","\u002Fadvanced\u002Fcode-mode","3.advanced\u002F8.code-mode","i-lucide-code",{"title":111,"path":112,"stem":113,"children":114,"page":39},"示例","\u002Fexamples","4.examples",[115,120,125,130,135],{"title":116,"path":117,"stem":118,"icon":119},"身份验证","\u002Fexamples\u002Fauthentication","4.examples\u002F1.authentication","i-lucide-shield-check",{"title":121,"path":122,"stem":123,"icon":124},"API 集成","\u002Fexamples\u002Fapi-integration","4.examples\u002F2.api-integration","i-lucide-globe",{"title":126,"path":127,"stem":128,"icon":129},"常见模式","\u002Fexamples\u002Fcommon-patterns","4.examples\u002F3.common-patterns","i-lucide-lightbulb",{"title":131,"path":132,"stem":133,"icon":134},"文件操作","\u002Fexamples\u002Ffile-operations","4.examples\u002F4.file-operations","i-lucide-file",{"title":136,"path":137,"stem":138,"icon":59},"提示词示例","\u002Fexamples\u002Fprompt-examples","4.examples\u002F5.prompt-examples",{"id":140,"title":46,"body":141,"description":5943,"extension":5944,"links":5945,"meta":5946,"navigation":5947,"path":47,"seo":5948,"stem":48,"__hash__":5950},"docs\u002F2.core-concepts\u002F2.tools.md",{"type":142,"value":143,"toc":5903},"minimark",[144,149,153,241,244,247,463,466,477,578,585,606,615,618,621,896,899,907,1001,1004,1433,1438,1578,1581,1588,2040,2049,2052,2059,2062,2078,2262,2270,2273,2278,2531,2534,2544,2727,2896,2917,2920,2923,3144,3147,3262,3265,3514,3522,3525,3539,3542,3802,3808,3810,3817,3821,3828,4078,4081,4172,4175,4182,4377,4380,4387,4390,4402,4565,4568,4571,4777,4780,4907,4916,4919,4923,4926,5194,5197,5214,5217,5224,5400,5403,5406,5413,5419,5422,5432,5533,5536,5562,5565,5572,5578,5583,5586,5589,5695,5698,5704,5842,5854,5861,5864,5899],[145,146,148],"h2",{"id":147},"什么是工具","什么是工具？",[150,151,152],"p",{},"工具是 AI 助手可以调用以执行操作或检索信息的函数。它们接受经过验证的输入参数并返回结构化的结果。",[154,155,156],"code-collapse",{},[157,158,164],"pre",{"className":159,"code":160,"filename":161,"language":162,"meta":163,"style":163},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","使用 @nuxtjs\u002Fmcp-toolkit 在我的 Nuxt 应用中创建一个新的 MCP 工具。\n\n- 在 server\u002Fmcp\u002Ftools\u002F 中创建一个文件（例如 server\u002Fmcp\u002Ftools\u002Fmy-tool.ts）\n- 使用 defineMcpTool（自动导入）并配置 description 和 handler\n- 使用 import { z } from 'zod' 导入 Zod，并在 inputSchema 中定义输入参数（例如 z.string().describe('...')）\n- handler 接收经过验证的输入，并返回字符串、数字、布尔值、对象或完整的 CallToolResult\n- 在错误情况下，使用 h3 的 createError({ statusCode, message }) 抛出错误\n- name 和 title 会根据文件名自动生成（例如 my-tool.ts → name: 'my-tool', title: 'My Tool'）\n- 添加 annotations 以提供行为提示（readOnlyHint, destructiveHint, idempotentHint, openWorldHint）\n- 使用子目录自动推断分组（例如 tools\u002Fadmin\u002Fdelete-user.ts → group: 'admin'）\n\n文档：https:\u002F\u002Fmcp-toolkit.nuxt.dev\u002Fcore-concepts\u002Ftools\n","Prompt","txt","",[165,166,167,175,182,188,194,200,206,212,218,224,230,235],"code",{"__ignoreMap":163},[168,169,172],"span",{"class":170,"line":171},"line",1,[168,173,174],{},"使用 @nuxtjs\u002Fmcp-toolkit 在我的 Nuxt 应用中创建一个新的 MCP 工具。\n",[168,176,178],{"class":170,"line":177},2,[168,179,181],{"emptyLinePlaceholder":180},true,"\n",[168,183,185],{"class":170,"line":184},3,[168,186,187],{},"- 在 server\u002Fmcp\u002Ftools\u002F 中创建一个文件（例如 server\u002Fmcp\u002Ftools\u002Fmy-tool.ts）\n",[168,189,191],{"class":170,"line":190},4,[168,192,193],{},"- 使用 defineMcpTool（自动导入）并配置 description 和 handler\n",[168,195,197],{"class":170,"line":196},5,[168,198,199],{},"- 使用 import { z } from 'zod' 导入 Zod，并在 inputSchema 中定义输入参数（例如 z.string().describe('...')）\n",[168,201,203],{"class":170,"line":202},6,[168,204,205],{},"- handler 接收经过验证的输入，并返回字符串、数字、布尔值、对象或完整的 CallToolResult\n",[168,207,209],{"class":170,"line":208},7,[168,210,211],{},"- 在错误情况下，使用 h3 的 createError({ statusCode, message }) 抛出错误\n",[168,213,215],{"class":170,"line":214},8,[168,216,217],{},"- name 和 title 会根据文件名自动生成（例如 my-tool.ts → name: 'my-tool', title: 'My Tool'）\n",[168,219,221],{"class":170,"line":220},9,[168,222,223],{},"- 添加 annotations 以提供行为提示（readOnlyHint, destructiveHint, idempotentHint, openWorldHint）\n",[168,225,227],{"class":170,"line":226},10,[168,228,229],{},"- 使用子目录自动推断分组（例如 tools\u002Fadmin\u002Fdelete-user.ts → group: 'admin'）\n",[168,231,233],{"class":170,"line":232},11,[168,234,181],{"emptyLinePlaceholder":180},[168,236,238],{"class":170,"line":237},12,[168,239,240],{},"文档：https:\u002F\u002Fmcp-toolkit.nuxt.dev\u002Fcore-concepts\u002Ftools\n",[145,242,243],{"id":243},"基础工具定义",[150,245,246],{},"以下是一个简单的回显消息的工具：",[157,248,253],{"className":249,"code":250,"filename":251,"language":252,"meta":163,"style":163},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'echo',\n  description: 'Echo back a message',\n  inputSchema: {\n    message: z.string().describe('The message to echo back'),\n  },\n  handler: async ({ message }) => `Echo: ${message}`,\n})\n","server\u002Fmcp\u002Ftools\u002Fecho.ts","typescript",[165,254,255,285,305,309,326,346,362,372,409,414,455],{"__ignoreMap":163},[168,256,257,261,265,269,272,275,278,282],{"class":170,"line":171},[168,258,260],{"class":259},"s7zQu","import",[168,262,264],{"class":263},"sMK4o"," {",[168,266,268],{"class":267},"sTEyZ"," z",[168,270,271],{"class":263}," }",[168,273,274],{"class":259}," from",[168,276,277],{"class":263}," '",[168,279,281],{"class":280},"sfazB","zod",[168,283,284],{"class":263},"'\n",[168,286,287,289,291,294,296,298,300,303],{"class":170,"line":177},[168,288,260],{"class":259},[168,290,264],{"class":263},[168,292,293],{"class":267}," defineMcpTool",[168,295,271],{"class":263},[168,297,274],{"class":259},[168,299,277],{"class":263},[168,301,302],{"class":280},"@nuxtjs\u002Fmcp-toolkit\u002Fserver",[168,304,284],{"class":263},[168,306,307],{"class":170,"line":184},[168,308,181],{"emptyLinePlaceholder":180},[168,310,311,314,317,320,323],{"class":170,"line":190},[168,312,313],{"class":259},"export",[168,315,316],{"class":259}," default",[168,318,293],{"class":319},"s2Zo4",[168,321,322],{"class":267},"(",[168,324,325],{"class":263},"{\n",[168,327,328,332,335,337,340,343],{"class":170,"line":196},[168,329,331],{"class":330},"swJcz","  name",[168,333,334],{"class":263},":",[168,336,277],{"class":263},[168,338,339],{"class":280},"echo",[168,341,342],{"class":263},"'",[168,344,345],{"class":263},",\n",[168,347,348,351,353,355,358,360],{"class":170,"line":202},[168,349,350],{"class":330},"  description",[168,352,334],{"class":263},[168,354,277],{"class":263},[168,356,357],{"class":280},"Echo back a message",[168,359,342],{"class":263},[168,361,345],{"class":263},[168,363,364,367,369],{"class":170,"line":208},[168,365,366],{"class":330},"  inputSchema",[168,368,334],{"class":263},[168,370,371],{"class":263}," {\n",[168,373,374,377,379,381,384,387,390,392,395,397,399,402,404,407],{"class":170,"line":214},[168,375,376],{"class":330},"    message",[168,378,334],{"class":263},[168,380,268],{"class":267},[168,382,383],{"class":263},".",[168,385,386],{"class":319},"string",[168,388,389],{"class":267},"()",[168,391,383],{"class":263},[168,393,394],{"class":319},"describe",[168,396,322],{"class":267},[168,398,342],{"class":263},[168,400,401],{"class":280},"The message to echo back",[168,403,342],{"class":263},[168,405,406],{"class":267},")",[168,408,345],{"class":263},[168,410,411],{"class":170,"line":220},[168,412,413],{"class":263},"  },\n",[168,415,416,419,421,425,428,432,435,438,441,444,447,450,453],{"class":170,"line":226},[168,417,418],{"class":319},"  handler",[168,420,334],{"class":263},[168,422,424],{"class":423},"spNyl"," async",[168,426,427],{"class":263}," ({",[168,429,431],{"class":430},"sHdIc"," message",[168,433,434],{"class":263}," })",[168,436,437],{"class":423}," =>",[168,439,440],{"class":263}," `",[168,442,443],{"class":280},"Echo: ",[168,445,446],{"class":263},"${",[168,448,449],{"class":267},"message",[168,451,452],{"class":263},"}`",[168,454,345],{"class":263},[168,456,457,460],{"class":170,"line":232},[168,458,459],{"class":263},"}",[168,461,462],{"class":267},")\n",[145,464,465],{"id":465},"自动生成的名称和标题",[150,467,468,469,472,473,476],{},"你可以省略 ",[165,470,471],{},"name"," 和 ",[165,474,475],{},"title"," —— 它们将根据文件名自动生成：",[157,478,481],{"className":249,"code":479,"filename":480,"language":252,"meta":163,"style":163},"import { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  \u002F\u002F name 和 title 将根据文件名自动生成：\n  \u002F\u002F name: 'list-documentation'\n  \u002F\u002F title: 'List Documentation'\n  description: 'List all documentation files',\n  handler: async () => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Flist-documentation.ts",[165,482,483,501,505,517,523,528,533,548,563,568,572],{"__ignoreMap":163},[168,484,485,487,489,491,493,495,497,499],{"class":170,"line":171},[168,486,260],{"class":259},[168,488,264],{"class":263},[168,490,293],{"class":267},[168,492,271],{"class":263},[168,494,274],{"class":259},[168,496,277],{"class":263},[168,498,302],{"class":280},[168,500,284],{"class":263},[168,502,503],{"class":170,"line":177},[168,504,181],{"emptyLinePlaceholder":180},[168,506,507,509,511,513,515],{"class":170,"line":184},[168,508,313],{"class":259},[168,510,316],{"class":259},[168,512,293],{"class":319},[168,514,322],{"class":267},[168,516,325],{"class":263},[168,518,519],{"class":170,"line":190},[168,520,522],{"class":521},"sHwdD","  \u002F\u002F name 和 title 将根据文件名自动生成：\n",[168,524,525],{"class":170,"line":196},[168,526,527],{"class":521},"  \u002F\u002F name: 'list-documentation'\n",[168,529,530],{"class":170,"line":202},[168,531,532],{"class":521},"  \u002F\u002F title: 'List Documentation'\n",[168,534,535,537,539,541,544,546],{"class":170,"line":208},[168,536,350],{"class":330},[168,538,334],{"class":263},[168,540,277],{"class":263},[168,542,543],{"class":280},"List all documentation files",[168,545,342],{"class":263},[168,547,345],{"class":263},[168,549,550,552,554,556,559,561],{"class":170,"line":214},[168,551,418],{"class":319},[168,553,334],{"class":263},[168,555,424],{"class":423},[168,557,558],{"class":263}," ()",[168,560,437],{"class":423},[168,562,371],{"class":263},[168,564,565],{"class":170,"line":220},[168,566,567],{"class":521},"    \u002F\u002F ...\n",[168,569,570],{"class":170,"line":226},[168,571,413],{"class":263},[168,573,574,576],{"class":170,"line":232},[168,575,459],{"class":263},[168,577,462],{"class":267},[150,579,580,581,584],{},"文件名 ",[165,582,583],{},"list-documentation.ts"," 将自动转换为：",[586,587,588,598],"ul",{},[589,590,591,593,594,597],"li",{},[165,592,471],{},"：",[165,595,596],{},"list-documentation","（短横线命名法）",[589,599,600,593,602,605],{},[165,601,475],{},[165,603,604],{},"List Documentation","（标题大小写）",[150,607,608,609,611,612,614],{},"你仍然可以显式提供 ",[165,610,471],{}," 或 ",[165,613,475],{}," 以覆盖自动生成的值。",[145,616,617],{"id":617},"工具结构",[150,619,620],{},"工具定义包含以下内容：",[622,623,624,723],"code-group",{},[157,625,628],{"className":249,"code":626,"filename":627,"language":252,"meta":163,"style":163},"export default defineMcpTool({\n  name: 'tool-name',        \u002F\u002F 唯一标识符（可选 - 根据文件名自动生成）\n  inputSchema: { ... },      \u002F\u002F 用于输入验证的 Zod 模式\n  handler: async (args) => {\n    return 'result'          \u002F\u002F 字符串、数字、布尔值、对象或 CallToolResult\n  },\n})\n","必填字段",[165,629,630,642,661,678,698,713,717],{"__ignoreMap":163},[168,631,632,634,636,638,640],{"class":170,"line":171},[168,633,313],{"class":259},[168,635,316],{"class":259},[168,637,293],{"class":319},[168,639,322],{"class":267},[168,641,325],{"class":263},[168,643,644,646,648,650,653,655,658],{"class":170,"line":177},[168,645,331],{"class":330},[168,647,334],{"class":263},[168,649,277],{"class":263},[168,651,652],{"class":280},"tool-name",[168,654,342],{"class":263},[168,656,657],{"class":263},",",[168,659,660],{"class":521},"        \u002F\u002F 唯一标识符（可选 - 根据文件名自动生成）\n",[168,662,663,665,667,669,672,675],{"class":170,"line":184},[168,664,366],{"class":330},[168,666,334],{"class":263},[168,668,264],{"class":263},[168,670,671],{"class":263}," ...",[168,673,674],{"class":263}," },",[168,676,677],{"class":521},"      \u002F\u002F 用于输入验证的 Zod 模式\n",[168,679,680,682,684,686,689,692,694,696],{"class":170,"line":190},[168,681,418],{"class":319},[168,683,334],{"class":263},[168,685,424],{"class":423},[168,687,688],{"class":263}," (",[168,690,691],{"class":430},"args",[168,693,406],{"class":263},[168,695,437],{"class":423},[168,697,371],{"class":263},[168,699,700,703,705,708,710],{"class":170,"line":196},[168,701,702],{"class":259},"    return",[168,704,277],{"class":263},[168,706,707],{"class":280},"result",[168,709,342],{"class":263},[168,711,712],{"class":521},"          \u002F\u002F 字符串、数字、布尔值、对象或 CallToolResult\n",[168,714,715],{"class":170,"line":202},[168,716,413],{"class":263},[168,718,719,721],{"class":170,"line":208},[168,720,459],{"class":263},[168,722,462],{"class":267},[157,724,727],{"className":249,"code":725,"filename":726,"language":252,"meta":163,"style":163},"export default defineMcpTool({\n  name: 'tool-name',              \u002F\u002F 可选 - 根据文件名自动生成\n  title: 'Tool Title',            \u002F\u002F 可选 - 根据文件名自动生成\n  description: 'Tool description',  \u002F\u002F 工具的功能描述\n  inputSchema: { ... },            \u002F\u002F 可选 - 用于输入验证的 Zod 模式\n  outputSchema: { ... },            \u002F\u002F 用于结构化输出的 Zod 模式\n  annotations: { ... },             \u002F\u002F 面向客户端的行为提示\n  inputExamples: [{ ... }],         \u002F\u002F 具体的使用示例\n  handler: async (args) => { ... },\n})\n","可选字段",[165,728,729,741,758,777,795,810,826,842,867,890],{"__ignoreMap":163},[168,730,731,733,735,737,739],{"class":170,"line":171},[168,732,313],{"class":259},[168,734,316],{"class":259},[168,736,293],{"class":319},[168,738,322],{"class":267},[168,740,325],{"class":263},[168,742,743,745,747,749,751,753,755],{"class":170,"line":177},[168,744,331],{"class":330},[168,746,334],{"class":263},[168,748,277],{"class":263},[168,750,652],{"class":280},[168,752,342],{"class":263},[168,754,657],{"class":263},[168,756,757],{"class":521},"              \u002F\u002F 可选 - 根据文件名自动生成\n",[168,759,760,763,765,767,770,772,774],{"class":170,"line":184},[168,761,762],{"class":330},"  title",[168,764,334],{"class":263},[168,766,277],{"class":263},[168,768,769],{"class":280},"Tool Title",[168,771,342],{"class":263},[168,773,657],{"class":263},[168,775,776],{"class":521},"            \u002F\u002F 可选 - 根据文件名自动生成\n",[168,778,779,781,783,785,788,790,792],{"class":170,"line":190},[168,780,350],{"class":330},[168,782,334],{"class":263},[168,784,277],{"class":263},[168,786,787],{"class":280},"Tool description",[168,789,342],{"class":263},[168,791,657],{"class":263},[168,793,794],{"class":521},"  \u002F\u002F 工具的功能描述\n",[168,796,797,799,801,803,805,807],{"class":170,"line":196},[168,798,366],{"class":330},[168,800,334],{"class":263},[168,802,264],{"class":263},[168,804,671],{"class":263},[168,806,674],{"class":263},[168,808,809],{"class":521},"            \u002F\u002F 可选 - 用于输入验证的 Zod 模式\n",[168,811,812,815,817,819,821,823],{"class":170,"line":202},[168,813,814],{"class":330},"  outputSchema",[168,816,334],{"class":263},[168,818,264],{"class":263},[168,820,671],{"class":263},[168,822,674],{"class":263},[168,824,825],{"class":521},"            \u002F\u002F 用于结构化输出的 Zod 模式\n",[168,827,828,831,833,835,837,839],{"class":170,"line":208},[168,829,830],{"class":330},"  annotations",[168,832,334],{"class":263},[168,834,264],{"class":263},[168,836,671],{"class":263},[168,838,674],{"class":263},[168,840,841],{"class":521},"             \u002F\u002F 面向客户端的行为提示\n",[168,843,844,847,849,852,855,857,859,862,864],{"class":170,"line":214},[168,845,846],{"class":330},"  inputExamples",[168,848,334],{"class":263},[168,850,851],{"class":267}," [",[168,853,854],{"class":263},"{",[168,856,671],{"class":263},[168,858,271],{"class":263},[168,860,861],{"class":267},"]",[168,863,657],{"class":263},[168,865,866],{"class":521},"         \u002F\u002F 具体的使用示例\n",[168,868,869,871,873,875,877,879,881,883,885,887],{"class":170,"line":220},[168,870,418],{"class":319},[168,872,334],{"class":263},[168,874,424],{"class":423},[168,876,688],{"class":263},[168,878,691],{"class":430},[168,880,406],{"class":263},[168,882,437],{"class":423},[168,884,264],{"class":263},[168,886,671],{"class":263},[168,888,889],{"class":263}," },\n",[168,891,892,894],{"class":170,"line":226},[168,893,459],{"class":263},[168,895,462],{"class":267},[145,897,898],{"id":898},"输入模式",[150,900,901,904,905,593],{},[165,902,903],{},"inputSchema"," 是可选的，它使用 Zod 来定义和验证输入参数。如果提供，每个字段都必须是一个 Zod 模式。没有参数的工具可以完全省略 ",[165,906,903],{},[157,908,910],{"className":249,"code":909,"filename":251,"language":252,"meta":163,"style":163},"import { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'echo',\n  description: 'Echo back a message',\n  handler: async () => 'Echo: test',\n})\n",[165,911,912,930,934,946,960,974,995],{"__ignoreMap":163},[168,913,914,916,918,920,922,924,926,928],{"class":170,"line":171},[168,915,260],{"class":259},[168,917,264],{"class":263},[168,919,293],{"class":267},[168,921,271],{"class":263},[168,923,274],{"class":259},[168,925,277],{"class":263},[168,927,302],{"class":280},[168,929,284],{"class":263},[168,931,932],{"class":170,"line":177},[168,933,181],{"emptyLinePlaceholder":180},[168,935,936,938,940,942,944],{"class":170,"line":184},[168,937,313],{"class":259},[168,939,316],{"class":259},[168,941,293],{"class":319},[168,943,322],{"class":267},[168,945,325],{"class":263},[168,947,948,950,952,954,956,958],{"class":170,"line":190},[168,949,331],{"class":330},[168,951,334],{"class":263},[168,953,277],{"class":263},[168,955,339],{"class":280},[168,957,342],{"class":263},[168,959,345],{"class":263},[168,961,962,964,966,968,970,972],{"class":170,"line":196},[168,963,350],{"class":330},[168,965,334],{"class":263},[168,967,277],{"class":263},[168,969,357],{"class":280},[168,971,342],{"class":263},[168,973,345],{"class":263},[168,975,976,978,980,982,984,986,988,991,993],{"class":170,"line":202},[168,977,418],{"class":319},[168,979,334],{"class":263},[168,981,424],{"class":423},[168,983,558],{"class":263},[168,985,437],{"class":423},[168,987,277],{"class":263},[168,989,990],{"class":280},"Echo: test",[168,992,342],{"class":263},[168,994,345],{"class":263},[168,996,997,999],{"class":170,"line":208},[168,998,459],{"class":263},[168,1000,462],{"class":267},[150,1002,1003],{},"对于带参数的工具，请使用 Zod 模式进行定义：",[157,1005,1008],{"className":249,"code":1006,"filename":1007,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'calculator',\n  inputSchema: {\n    \u002F\u002F 字符串输入\n    operation: z.string().describe('Operation to perform'),\n\n    \u002F\u002F 数字输入\n    a: z.number().describe('First number'),\n    b: z.number().describe('Second number'),\n\n    \u002F\u002F 可选字段\n    precision: z.number().optional().describe('Decimal precision'),\n\n    \u002F\u002F 枚举输入\n    format: z.enum(['decimal', 'fraction']).describe('Output format'),\n\n    \u002F\u002F 数组输入\n    numbers: z.array(z.number()).describe('List of numbers'),\n  },\n  handler: async ({ operation, a, b, precision, format, numbers }) => {\n    \u002F\u002F 处理器实现\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fcalculator.ts",[165,1009,1010,1028,1046,1050,1062,1077,1085,1090,1122,1126,1131,1164,1196,1201,1207,1247,1252,1258,1312,1317,1323,1365,1370,1415,1421,1426],{"__ignoreMap":163},[168,1011,1012,1014,1016,1018,1020,1022,1024,1026],{"class":170,"line":171},[168,1013,260],{"class":259},[168,1015,264],{"class":263},[168,1017,268],{"class":267},[168,1019,271],{"class":263},[168,1021,274],{"class":259},[168,1023,277],{"class":263},[168,1025,281],{"class":280},[168,1027,284],{"class":263},[168,1029,1030,1032,1034,1036,1038,1040,1042,1044],{"class":170,"line":177},[168,1031,260],{"class":259},[168,1033,264],{"class":263},[168,1035,293],{"class":267},[168,1037,271],{"class":263},[168,1039,274],{"class":259},[168,1041,277],{"class":263},[168,1043,302],{"class":280},[168,1045,284],{"class":263},[168,1047,1048],{"class":170,"line":184},[168,1049,181],{"emptyLinePlaceholder":180},[168,1051,1052,1054,1056,1058,1060],{"class":170,"line":190},[168,1053,313],{"class":259},[168,1055,316],{"class":259},[168,1057,293],{"class":319},[168,1059,322],{"class":267},[168,1061,325],{"class":263},[168,1063,1064,1066,1068,1070,1073,1075],{"class":170,"line":196},[168,1065,331],{"class":330},[168,1067,334],{"class":263},[168,1069,277],{"class":263},[168,1071,1072],{"class":280},"calculator",[168,1074,342],{"class":263},[168,1076,345],{"class":263},[168,1078,1079,1081,1083],{"class":170,"line":202},[168,1080,366],{"class":330},[168,1082,334],{"class":263},[168,1084,371],{"class":263},[168,1086,1087],{"class":170,"line":208},[168,1088,1089],{"class":521},"    \u002F\u002F 字符串输入\n",[168,1091,1092,1095,1097,1099,1101,1103,1105,1107,1109,1111,1113,1116,1118,1120],{"class":170,"line":214},[168,1093,1094],{"class":330},"    operation",[168,1096,334],{"class":263},[168,1098,268],{"class":267},[168,1100,383],{"class":263},[168,1102,386],{"class":319},[168,1104,389],{"class":267},[168,1106,383],{"class":263},[168,1108,394],{"class":319},[168,1110,322],{"class":267},[168,1112,342],{"class":263},[168,1114,1115],{"class":280},"Operation to perform",[168,1117,342],{"class":263},[168,1119,406],{"class":267},[168,1121,345],{"class":263},[168,1123,1124],{"class":170,"line":220},[168,1125,181],{"emptyLinePlaceholder":180},[168,1127,1128],{"class":170,"line":226},[168,1129,1130],{"class":521},"    \u002F\u002F 数字输入\n",[168,1132,1133,1136,1138,1140,1142,1145,1147,1149,1151,1153,1155,1158,1160,1162],{"class":170,"line":232},[168,1134,1135],{"class":330},"    a",[168,1137,334],{"class":263},[168,1139,268],{"class":267},[168,1141,383],{"class":263},[168,1143,1144],{"class":319},"number",[168,1146,389],{"class":267},[168,1148,383],{"class":263},[168,1150,394],{"class":319},[168,1152,322],{"class":267},[168,1154,342],{"class":263},[168,1156,1157],{"class":280},"First number",[168,1159,342],{"class":263},[168,1161,406],{"class":267},[168,1163,345],{"class":263},[168,1165,1166,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1190,1192,1194],{"class":170,"line":237},[168,1167,1168],{"class":330},"    b",[168,1170,334],{"class":263},[168,1172,268],{"class":267},[168,1174,383],{"class":263},[168,1176,1144],{"class":319},[168,1178,389],{"class":267},[168,1180,383],{"class":263},[168,1182,394],{"class":319},[168,1184,322],{"class":267},[168,1186,342],{"class":263},[168,1188,1189],{"class":280},"Second number",[168,1191,342],{"class":263},[168,1193,406],{"class":267},[168,1195,345],{"class":263},[168,1197,1199],{"class":170,"line":1198},13,[168,1200,181],{"emptyLinePlaceholder":180},[168,1202,1204],{"class":170,"line":1203},14,[168,1205,1206],{"class":521},"    \u002F\u002F 可选字段\n",[168,1208,1210,1213,1215,1217,1219,1221,1223,1225,1228,1230,1232,1234,1236,1238,1241,1243,1245],{"class":170,"line":1209},15,[168,1211,1212],{"class":330},"    precision",[168,1214,334],{"class":263},[168,1216,268],{"class":267},[168,1218,383],{"class":263},[168,1220,1144],{"class":319},[168,1222,389],{"class":267},[168,1224,383],{"class":263},[168,1226,1227],{"class":319},"optional",[168,1229,389],{"class":267},[168,1231,383],{"class":263},[168,1233,394],{"class":319},[168,1235,322],{"class":267},[168,1237,342],{"class":263},[168,1239,1240],{"class":280},"Decimal precision",[168,1242,342],{"class":263},[168,1244,406],{"class":267},[168,1246,345],{"class":263},[168,1248,1250],{"class":170,"line":1249},16,[168,1251,181],{"emptyLinePlaceholder":180},[168,1253,1255],{"class":170,"line":1254},17,[168,1256,1257],{"class":521},"    \u002F\u002F 枚举输入\n",[168,1259,1261,1264,1266,1268,1270,1273,1276,1278,1281,1283,1285,1287,1290,1292,1295,1297,1299,1301,1303,1306,1308,1310],{"class":170,"line":1260},18,[168,1262,1263],{"class":330},"    format",[168,1265,334],{"class":263},[168,1267,268],{"class":267},[168,1269,383],{"class":263},[168,1271,1272],{"class":319},"enum",[168,1274,1275],{"class":267},"([",[168,1277,342],{"class":263},[168,1279,1280],{"class":280},"decimal",[168,1282,342],{"class":263},[168,1284,657],{"class":263},[168,1286,277],{"class":263},[168,1288,1289],{"class":280},"fraction",[168,1291,342],{"class":263},[168,1293,1294],{"class":267},"])",[168,1296,383],{"class":263},[168,1298,394],{"class":319},[168,1300,322],{"class":267},[168,1302,342],{"class":263},[168,1304,1305],{"class":280},"Output format",[168,1307,342],{"class":263},[168,1309,406],{"class":267},[168,1311,345],{"class":263},[168,1313,1315],{"class":170,"line":1314},19,[168,1316,181],{"emptyLinePlaceholder":180},[168,1318,1320],{"class":170,"line":1319},20,[168,1321,1322],{"class":521},"    \u002F\u002F 数组输入\n",[168,1324,1326,1329,1331,1333,1335,1338,1341,1343,1345,1348,1350,1352,1354,1356,1359,1361,1363],{"class":170,"line":1325},21,[168,1327,1328],{"class":330},"    numbers",[168,1330,334],{"class":263},[168,1332,268],{"class":267},[168,1334,383],{"class":263},[168,1336,1337],{"class":319},"array",[168,1339,1340],{"class":267},"(z",[168,1342,383],{"class":263},[168,1344,1144],{"class":319},[168,1346,1347],{"class":267},"())",[168,1349,383],{"class":263},[168,1351,394],{"class":319},[168,1353,322],{"class":267},[168,1355,342],{"class":263},[168,1357,1358],{"class":280},"List of numbers",[168,1360,342],{"class":263},[168,1362,406],{"class":267},[168,1364,345],{"class":263},[168,1366,1368],{"class":170,"line":1367},22,[168,1369,413],{"class":263},[168,1371,1373,1375,1377,1379,1381,1384,1386,1389,1391,1394,1396,1399,1401,1404,1406,1409,1411,1413],{"class":170,"line":1372},23,[168,1374,418],{"class":319},[168,1376,334],{"class":263},[168,1378,424],{"class":423},[168,1380,427],{"class":263},[168,1382,1383],{"class":430}," operation",[168,1385,657],{"class":263},[168,1387,1388],{"class":430}," a",[168,1390,657],{"class":263},[168,1392,1393],{"class":430}," b",[168,1395,657],{"class":263},[168,1397,1398],{"class":430}," precision",[168,1400,657],{"class":263},[168,1402,1403],{"class":430}," format",[168,1405,657],{"class":263},[168,1407,1408],{"class":430}," numbers",[168,1410,434],{"class":263},[168,1412,437],{"class":423},[168,1414,371],{"class":263},[168,1416,1418],{"class":170,"line":1417},24,[168,1419,1420],{"class":521},"    \u002F\u002F 处理器实现\n",[168,1422,1424],{"class":170,"line":1423},25,[168,1425,413],{"class":263},[168,1427,1429,1431],{"class":170,"line":1428},26,[168,1430,459],{"class":263},[168,1432,462],{"class":267},[1434,1435,1437],"h3",{"id":1436},"常用-zod-类型","常用 Zod 类型",[1439,1440,1441,1456],"table",{},[1442,1443,1444],"thead",{},[1445,1446,1447,1451,1453],"tr",{},[1448,1449,1450],"th",{},"Zod 类型",[1448,1452,111],{},[1448,1454,1455],{},"描述",[1457,1458,1459,1475,1490,1504,1519,1534,1549,1563],"tbody",{},[1445,1460,1461,1467,1472],{},[1462,1463,1464],"td",{},[165,1465,1466],{},"z.string()",[1462,1468,1469],{},[165,1470,1471],{},"z.string().min(1).max(100)",[1462,1473,1474],{},"带验证的字符串",[1445,1476,1477,1482,1487],{},[1462,1478,1479],{},[165,1480,1481],{},"z.number()",[1462,1483,1484],{},[165,1485,1486],{},"z.number().min(0).max(100)",[1462,1488,1489],{},"带验证的数字",[1445,1491,1492,1497,1501],{},[1462,1493,1494],{},[165,1495,1496],{},"z.boolean()",[1462,1498,1499],{},[165,1500,1496],{},[1462,1502,1503],{},"布尔值",[1445,1505,1506,1511,1516],{},[1462,1507,1508],{},[165,1509,1510],{},"z.array()",[1462,1512,1513],{},[165,1514,1515],{},"z.array(z.string())",[1462,1517,1518],{},"值数组",[1445,1520,1521,1526,1531],{},[1462,1522,1523],{},[165,1524,1525],{},"z.object()",[1462,1527,1528],{},[165,1529,1530],{},"z.object({ ... })",[1462,1532,1533],{},"嵌套对象",[1445,1535,1536,1541,1546],{},[1462,1537,1538],{},[165,1539,1540],{},"z.enum()",[1462,1542,1543],{},[165,1544,1545],{},"z.enum(['a', 'b'])",[1462,1547,1548],{},"枚举",[1445,1550,1551,1556,1561],{},[1462,1552,1553],{},[165,1554,1555],{},"z.optional()",[1462,1557,1558],{},[165,1559,1560],{},"z.string().optional()",[1462,1562,726],{},[1445,1564,1565,1570,1575],{},[1462,1566,1567],{},[165,1568,1569],{},"z.default()",[1462,1571,1572],{},[165,1573,1574],{},"z.string().default('value')",[1462,1576,1577],{},"带默认值的字段",[145,1579,1580],{"id":1580},"输出模式",[150,1582,1583,1584,1587],{},"使用 ",[165,1585,1586],{},"outputSchema"," 定义结构化输出：",[157,1589,1592],{"className":249,"code":1590,"filename":1591,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'calculate-bmi',\n  description: 'Calculate Body Mass Index',\n  inputSchema: {\n    weightKg: z.number().describe('Weight in kilograms'),\n    heightM: z.number().describe('Height in meters'),\n  },\n  outputSchema: {\n    bmi: z.number(),\n    category: z.string(),\n  },\n  handler: async ({ weightKg, heightM }) => {\n    const bmi = weightKg \u002F (heightM * heightM)\n    let category = 'Normal'\n    if (bmi \u003C 18.5) category = 'Underweight'\n    else if (bmi >= 25) category = 'Overweight'\n    else if (bmi >= 30) category = 'Obese'\n\n    return {\n      structuredContent: {\n        bmi: Math.round(bmi * 100) \u002F 100,\n        category,\n      },\n    }\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fbmi.ts",[165,1593,1594,1612,1630,1634,1646,1661,1676,1684,1716,1748,1752,1760,1777,1794,1798,1822,1850,1867,1899,1930,1958,1962,1968,1977,2010,2017,2022,2028,2033],{"__ignoreMap":163},[168,1595,1596,1598,1600,1602,1604,1606,1608,1610],{"class":170,"line":171},[168,1597,260],{"class":259},[168,1599,264],{"class":263},[168,1601,268],{"class":267},[168,1603,271],{"class":263},[168,1605,274],{"class":259},[168,1607,277],{"class":263},[168,1609,281],{"class":280},[168,1611,284],{"class":263},[168,1613,1614,1616,1618,1620,1622,1624,1626,1628],{"class":170,"line":177},[168,1615,260],{"class":259},[168,1617,264],{"class":263},[168,1619,293],{"class":267},[168,1621,271],{"class":263},[168,1623,274],{"class":259},[168,1625,277],{"class":263},[168,1627,302],{"class":280},[168,1629,284],{"class":263},[168,1631,1632],{"class":170,"line":184},[168,1633,181],{"emptyLinePlaceholder":180},[168,1635,1636,1638,1640,1642,1644],{"class":170,"line":190},[168,1637,313],{"class":259},[168,1639,316],{"class":259},[168,1641,293],{"class":319},[168,1643,322],{"class":267},[168,1645,325],{"class":263},[168,1647,1648,1650,1652,1654,1657,1659],{"class":170,"line":196},[168,1649,331],{"class":330},[168,1651,334],{"class":263},[168,1653,277],{"class":263},[168,1655,1656],{"class":280},"calculate-bmi",[168,1658,342],{"class":263},[168,1660,345],{"class":263},[168,1662,1663,1665,1667,1669,1672,1674],{"class":170,"line":202},[168,1664,350],{"class":330},[168,1666,334],{"class":263},[168,1668,277],{"class":263},[168,1670,1671],{"class":280},"Calculate Body Mass Index",[168,1673,342],{"class":263},[168,1675,345],{"class":263},[168,1677,1678,1680,1682],{"class":170,"line":208},[168,1679,366],{"class":330},[168,1681,334],{"class":263},[168,1683,371],{"class":263},[168,1685,1686,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1710,1712,1714],{"class":170,"line":214},[168,1687,1688],{"class":330},"    weightKg",[168,1690,334],{"class":263},[168,1692,268],{"class":267},[168,1694,383],{"class":263},[168,1696,1144],{"class":319},[168,1698,389],{"class":267},[168,1700,383],{"class":263},[168,1702,394],{"class":319},[168,1704,322],{"class":267},[168,1706,342],{"class":263},[168,1708,1709],{"class":280},"Weight in kilograms",[168,1711,342],{"class":263},[168,1713,406],{"class":267},[168,1715,345],{"class":263},[168,1717,1718,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739,1742,1744,1746],{"class":170,"line":220},[168,1719,1720],{"class":330},"    heightM",[168,1722,334],{"class":263},[168,1724,268],{"class":267},[168,1726,383],{"class":263},[168,1728,1144],{"class":319},[168,1730,389],{"class":267},[168,1732,383],{"class":263},[168,1734,394],{"class":319},[168,1736,322],{"class":267},[168,1738,342],{"class":263},[168,1740,1741],{"class":280},"Height in meters",[168,1743,342],{"class":263},[168,1745,406],{"class":267},[168,1747,345],{"class":263},[168,1749,1750],{"class":170,"line":226},[168,1751,413],{"class":263},[168,1753,1754,1756,1758],{"class":170,"line":232},[168,1755,814],{"class":330},[168,1757,334],{"class":263},[168,1759,371],{"class":263},[168,1761,1762,1765,1767,1769,1771,1773,1775],{"class":170,"line":237},[168,1763,1764],{"class":330},"    bmi",[168,1766,334],{"class":263},[168,1768,268],{"class":267},[168,1770,383],{"class":263},[168,1772,1144],{"class":319},[168,1774,389],{"class":267},[168,1776,345],{"class":263},[168,1778,1779,1782,1784,1786,1788,1790,1792],{"class":170,"line":1198},[168,1780,1781],{"class":330},"    category",[168,1783,334],{"class":263},[168,1785,268],{"class":267},[168,1787,383],{"class":263},[168,1789,386],{"class":319},[168,1791,389],{"class":267},[168,1793,345],{"class":263},[168,1795,1796],{"class":170,"line":1203},[168,1797,413],{"class":263},[168,1799,1800,1802,1804,1806,1808,1811,1813,1816,1818,1820],{"class":170,"line":1209},[168,1801,418],{"class":319},[168,1803,334],{"class":263},[168,1805,424],{"class":423},[168,1807,427],{"class":263},[168,1809,1810],{"class":430}," weightKg",[168,1812,657],{"class":263},[168,1814,1815],{"class":430}," heightM",[168,1817,434],{"class":263},[168,1819,437],{"class":423},[168,1821,371],{"class":263},[168,1823,1824,1827,1830,1833,1835,1838,1840,1843,1846,1848],{"class":170,"line":1249},[168,1825,1826],{"class":423},"    const",[168,1828,1829],{"class":267}," bmi",[168,1831,1832],{"class":263}," =",[168,1834,1810],{"class":267},[168,1836,1837],{"class":263}," \u002F",[168,1839,688],{"class":330},[168,1841,1842],{"class":267},"heightM",[168,1844,1845],{"class":263}," *",[168,1847,1815],{"class":267},[168,1849,462],{"class":330},[168,1851,1852,1855,1858,1860,1862,1865],{"class":170,"line":1254},[168,1853,1854],{"class":423},"    let",[168,1856,1857],{"class":267}," category",[168,1859,1832],{"class":263},[168,1861,277],{"class":263},[168,1863,1864],{"class":280},"Normal",[168,1866,284],{"class":263},[168,1868,1869,1872,1874,1877,1880,1884,1887,1890,1892,1894,1897],{"class":170,"line":1260},[168,1870,1871],{"class":259},"    if",[168,1873,688],{"class":330},[168,1875,1876],{"class":267},"bmi",[168,1878,1879],{"class":263}," \u003C",[168,1881,1883],{"class":1882},"sbssI"," 18.5",[168,1885,1886],{"class":330},") ",[168,1888,1889],{"class":267},"category",[168,1891,1832],{"class":263},[168,1893,277],{"class":263},[168,1895,1896],{"class":280},"Underweight",[168,1898,284],{"class":263},[168,1900,1901,1904,1907,1909,1911,1914,1917,1919,1921,1923,1925,1928],{"class":170,"line":1314},[168,1902,1903],{"class":259},"    else",[168,1905,1906],{"class":259}," if",[168,1908,688],{"class":330},[168,1910,1876],{"class":267},[168,1912,1913],{"class":263}," >=",[168,1915,1916],{"class":1882}," 25",[168,1918,1886],{"class":330},[168,1920,1889],{"class":267},[168,1922,1832],{"class":263},[168,1924,277],{"class":263},[168,1926,1927],{"class":280},"Overweight",[168,1929,284],{"class":263},[168,1931,1932,1934,1936,1938,1940,1942,1945,1947,1949,1951,1953,1956],{"class":170,"line":1319},[168,1933,1903],{"class":259},[168,1935,1906],{"class":259},[168,1937,688],{"class":330},[168,1939,1876],{"class":267},[168,1941,1913],{"class":263},[168,1943,1944],{"class":1882}," 30",[168,1946,1886],{"class":330},[168,1948,1889],{"class":267},[168,1950,1832],{"class":263},[168,1952,277],{"class":263},[168,1954,1955],{"class":280},"Obese",[168,1957,284],{"class":263},[168,1959,1960],{"class":170,"line":1325},[168,1961,181],{"emptyLinePlaceholder":180},[168,1963,1964,1966],{"class":170,"line":1367},[168,1965,702],{"class":259},[168,1967,371],{"class":263},[168,1969,1970,1973,1975],{"class":170,"line":1372},[168,1971,1972],{"class":330},"      structuredContent",[168,1974,334],{"class":263},[168,1976,371],{"class":263},[168,1978,1979,1982,1984,1987,1989,1992,1994,1996,1998,2001,2003,2006,2008],{"class":170,"line":1417},[168,1980,1981],{"class":330},"        bmi",[168,1983,334],{"class":263},[168,1985,1986],{"class":267}," Math",[168,1988,383],{"class":263},[168,1990,1991],{"class":319},"round",[168,1993,322],{"class":330},[168,1995,1876],{"class":267},[168,1997,1845],{"class":263},[168,1999,2000],{"class":1882}," 100",[168,2002,1886],{"class":330},[168,2004,2005],{"class":263},"\u002F",[168,2007,2000],{"class":1882},[168,2009,345],{"class":263},[168,2011,2012,2015],{"class":170,"line":1423},[168,2013,2014],{"class":267},"        category",[168,2016,345],{"class":263},[168,2018,2019],{"class":170,"line":1428},[168,2020,2021],{"class":263},"      },\n",[168,2023,2025],{"class":170,"line":2024},27,[168,2026,2027],{"class":263},"    }\n",[168,2029,2031],{"class":170,"line":2030},28,[168,2032,413],{"class":263},[168,2034,2036,2038],{"class":170,"line":2035},29,[168,2037,459],{"class":263},[168,2039,462],{"class":267},[150,2041,2042,2045,2046,2048],{},[165,2043,2044],{},"structuredContent"," 字段提供与你的 ",[165,2047,1586],{}," 匹配的结构化数据，使 AI 助手更容易处理结果。",[145,2050,2051],{"id":2051},"处理器函数",[150,2053,2054,2055,2058],{},"handler 是一个异步函数，它接收经过验证的输入并返回结果。你可以直接返回简化的值 —— 它们会被自动包装为 MCP 的 ",[165,2056,2057],{},"CallToolResult"," 格式。",[1434,2060,2061],{"id":2061},"简化返回",[150,2063,2064,2065,2067,2068,2067,2070,2067,2073,611,2076,593],{},"直接从你的 handler 返回 ",[165,2066,386],{},"、",[165,2069,1144],{},[165,2071,2072],{},"boolean",[165,2074,2075],{},"object",[165,2077,1337],{},[622,2079,2080,2122,2162,2228],{},[157,2081,2084],{"className":249,"code":2082,"filename":2083,"language":252,"meta":163,"style":163},"handler: async ({ name }) => `Hello ${name}`\n\u002F\u002F → { content: [{ type: 'text', text: 'Hello World' }] }\n","字符串",[165,2085,2086,2117],{"__ignoreMap":163},[168,2087,2088,2092,2094,2096,2098,2101,2103,2105,2107,2110,2112,2114],{"class":170,"line":171},[168,2089,2091],{"class":2090},"sBMFI","handler",[168,2093,334],{"class":263},[168,2095,424],{"class":423},[168,2097,427],{"class":263},[168,2099,2100],{"class":430}," name",[168,2102,434],{"class":263},[168,2104,437],{"class":423},[168,2106,440],{"class":263},[168,2108,2109],{"class":280},"Hello ",[168,2111,446],{"class":263},[168,2113,471],{"class":267},[168,2115,2116],{"class":263},"}`\n",[168,2118,2119],{"class":170,"line":177},[168,2120,2121],{"class":521},"\u002F\u002F → { content: [{ type: 'text', text: 'Hello World' }] }\n",[157,2123,2126],{"className":249,"code":2124,"filename":2125,"language":252,"meta":163,"style":163},"handler: async ({ a, b }) => a + b\n\u002F\u002F → { content: [{ type: 'text', text: '10' }] }\n","数字",[165,2127,2128,2157],{"__ignoreMap":163},[168,2129,2130,2132,2134,2136,2138,2140,2142,2144,2146,2148,2151,2154],{"class":170,"line":171},[168,2131,2091],{"class":2090},[168,2133,334],{"class":263},[168,2135,424],{"class":423},[168,2137,427],{"class":263},[168,2139,1388],{"class":430},[168,2141,657],{"class":263},[168,2143,1393],{"class":430},[168,2145,434],{"class":263},[168,2147,437],{"class":423},[168,2149,2150],{"class":267}," a ",[168,2152,2153],{"class":263},"+",[168,2155,2156],{"class":267}," b\n",[168,2158,2159],{"class":170,"line":177},[168,2160,2161],{"class":521},"\u002F\u002F → { content: [{ type: 'text', text: '10' }] }\n",[157,2163,2166],{"className":249,"code":2164,"filename":2165,"language":252,"meta":163,"style":163},"handler: async ({ id }) => {\n  const user = await getUser(id)\n  return user\n}\n\u002F\u002F → { content: [{ type: 'text', text: '{ \"id\": ... }' }] }\n","对象 \u002F 数组",[165,2167,2168,2187,2210,2218,2223],{"__ignoreMap":163},[168,2169,2170,2172,2174,2176,2178,2181,2183,2185],{"class":170,"line":171},[168,2171,2091],{"class":2090},[168,2173,334],{"class":263},[168,2175,424],{"class":423},[168,2177,427],{"class":263},[168,2179,2180],{"class":430}," id",[168,2182,434],{"class":263},[168,2184,437],{"class":423},[168,2186,371],{"class":263},[168,2188,2189,2192,2195,2197,2200,2203,2205,2208],{"class":170,"line":177},[168,2190,2191],{"class":423},"  const",[168,2193,2194],{"class":267}," user",[168,2196,1832],{"class":263},[168,2198,2199],{"class":259}," await",[168,2201,2202],{"class":319}," getUser",[168,2204,322],{"class":330},[168,2206,2207],{"class":267},"id",[168,2209,462],{"class":330},[168,2211,2212,2215],{"class":170,"line":184},[168,2213,2214],{"class":259},"  return",[168,2216,2217],{"class":267}," user\n",[168,2219,2220],{"class":170,"line":190},[168,2221,2222],{"class":263},"}\n",[168,2224,2225],{"class":170,"line":196},[168,2226,2227],{"class":521},"\u002F\u002F → { content: [{ type: 'text', text: '{ \"id\": ... }' }] }\n",[157,2229,2231],{"className":249,"code":2230,"filename":1503,"language":252,"meta":163,"style":163},"handler: async ({ id }) => await exists(id)\n\u002F\u002F → { content: [{ type: 'text', text: 'true' }] }\n",[165,2232,2233,2257],{"__ignoreMap":163},[168,2234,2235,2237,2239,2241,2243,2245,2247,2249,2251,2254],{"class":170,"line":171},[168,2236,2091],{"class":2090},[168,2238,334],{"class":263},[168,2240,424],{"class":423},[168,2242,427],{"class":263},[168,2244,2180],{"class":430},[168,2246,434],{"class":263},[168,2248,437],{"class":423},[168,2250,2199],{"class":259},[168,2252,2253],{"class":319}," exists",[168,2255,2256],{"class":267},"(id)\n",[168,2258,2259],{"class":170,"line":177},[168,2260,2261],{"class":521},"\u002F\u002F → { content: [{ type: 'text', text: 'true' }] }\n",[150,2263,2264,2265,2267,2268,2058],{},"当你需要更多控制权时（例如图像、多个内容项、",[165,2266,2044],{},"），也可以返回完整的 ",[165,2269,2057],{},[1434,2271,2272],{"id":2272},"内容类型",[150,2274,2275,2276,593],{},"对于高级用例，返回带有类型化内容的完整 ",[165,2277,2057],{},[622,2279,2280,2361,2420],{},[157,2281,2284],{"className":249,"code":2282,"filename":2283,"language":252,"meta":163,"style":163},"return {\n  content: [{\n    type: 'image',\n    data: base64ImageData,\n    mimeType: 'image\u002Fpng',\n  }],\n}\n","图像内容",[165,2285,2286,2293,2304,2320,2332,2348,2357],{"__ignoreMap":163},[168,2287,2288,2291],{"class":170,"line":171},[168,2289,2290],{"class":259},"return",[168,2292,371],{"class":263},[168,2294,2295,2298,2300,2302],{"class":170,"line":177},[168,2296,2297],{"class":330},"  content",[168,2299,334],{"class":263},[168,2301,851],{"class":267},[168,2303,325],{"class":263},[168,2305,2306,2309,2311,2313,2316,2318],{"class":170,"line":184},[168,2307,2308],{"class":330},"    type",[168,2310,334],{"class":263},[168,2312,277],{"class":263},[168,2314,2315],{"class":280},"image",[168,2317,342],{"class":263},[168,2319,345],{"class":263},[168,2321,2322,2325,2327,2330],{"class":170,"line":190},[168,2323,2324],{"class":330},"    data",[168,2326,334],{"class":263},[168,2328,2329],{"class":267}," base64ImageData",[168,2331,345],{"class":263},[168,2333,2334,2337,2339,2341,2344,2346],{"class":170,"line":196},[168,2335,2336],{"class":330},"    mimeType",[168,2338,334],{"class":263},[168,2340,277],{"class":263},[168,2342,2343],{"class":280},"image\u002Fpng",[168,2345,342],{"class":263},[168,2347,345],{"class":263},[168,2349,2350,2353,2355],{"class":170,"line":202},[168,2351,2352],{"class":263},"  }",[168,2354,861],{"class":267},[168,2356,345],{"class":263},[168,2358,2359],{"class":170,"line":208},[168,2360,2222],{"class":263},[157,2362,2365],{"className":249,"code":2363,"filename":2364,"language":252,"meta":163,"style":163},"return {\n  structuredContent: {\n    bmi: 25.5,\n    category: 'Normal',\n  },\n}\n\u002F\u002F 文本内容将自动生成，作为旧版客户端的后备方案\n","结构化内容",[165,2366,2367,2373,2382,2393,2407,2411,2415],{"__ignoreMap":163},[168,2368,2369,2371],{"class":170,"line":171},[168,2370,2290],{"class":259},[168,2372,371],{"class":263},[168,2374,2375,2378,2380],{"class":170,"line":177},[168,2376,2377],{"class":330},"  structuredContent",[168,2379,334],{"class":263},[168,2381,371],{"class":263},[168,2383,2384,2386,2388,2391],{"class":170,"line":184},[168,2385,1764],{"class":330},[168,2387,334],{"class":263},[168,2389,2390],{"class":1882}," 25.5",[168,2392,345],{"class":263},[168,2394,2395,2397,2399,2401,2403,2405],{"class":170,"line":190},[168,2396,1781],{"class":330},[168,2398,334],{"class":263},[168,2400,277],{"class":263},[168,2402,1864],{"class":280},[168,2404,342],{"class":263},[168,2406,345],{"class":263},[168,2408,2409],{"class":170,"line":196},[168,2410,413],{"class":263},[168,2412,2413],{"class":170,"line":202},[168,2414,2222],{"class":263},[168,2416,2417],{"class":170,"line":208},[168,2418,2419],{"class":521},"\u002F\u002F 文本内容将自动生成，作为旧版客户端的后备方案\n",[157,2421,2424],{"className":249,"code":2422,"filename":2423,"language":252,"meta":163,"style":163},"return {\n  content: [{\n    type: 'resource',\n    resource: {\n      uri: 'file:\u002F\u002F\u002Fpath\u002Fto\u002Ffile',\n      text: 'File content',\n      mimeType: 'text\u002Fplain',\n    },\n  }],\n}\n","资源引用",[165,2425,2426,2432,2442,2457,2466,2482,2498,2514,2519,2527],{"__ignoreMap":163},[168,2427,2428,2430],{"class":170,"line":171},[168,2429,2290],{"class":259},[168,2431,371],{"class":263},[168,2433,2434,2436,2438,2440],{"class":170,"line":177},[168,2435,2297],{"class":330},[168,2437,334],{"class":263},[168,2439,851],{"class":267},[168,2441,325],{"class":263},[168,2443,2444,2446,2448,2450,2453,2455],{"class":170,"line":184},[168,2445,2308],{"class":330},[168,2447,334],{"class":263},[168,2449,277],{"class":263},[168,2451,2452],{"class":280},"resource",[168,2454,342],{"class":263},[168,2456,345],{"class":263},[168,2458,2459,2462,2464],{"class":170,"line":190},[168,2460,2461],{"class":330},"    resource",[168,2463,334],{"class":263},[168,2465,371],{"class":263},[168,2467,2468,2471,2473,2475,2478,2480],{"class":170,"line":196},[168,2469,2470],{"class":330},"      uri",[168,2472,334],{"class":263},[168,2474,277],{"class":263},[168,2476,2477],{"class":280},"file:\u002F\u002F\u002Fpath\u002Fto\u002Ffile",[168,2479,342],{"class":263},[168,2481,345],{"class":263},[168,2483,2484,2487,2489,2491,2494,2496],{"class":170,"line":202},[168,2485,2486],{"class":330},"      text",[168,2488,334],{"class":263},[168,2490,277],{"class":263},[168,2492,2493],{"class":280},"File content",[168,2495,342],{"class":263},[168,2497,345],{"class":263},[168,2499,2500,2503,2505,2507,2510,2512],{"class":170,"line":208},[168,2501,2502],{"class":330},"      mimeType",[168,2504,334],{"class":263},[168,2506,277],{"class":263},[168,2508,2509],{"class":280},"text\u002Fplain",[168,2511,342],{"class":263},[168,2513,345],{"class":263},[168,2515,2516],{"class":170,"line":214},[168,2517,2518],{"class":263},"    },\n",[168,2520,2521,2523,2525],{"class":170,"line":220},[168,2522,2352],{"class":263},[168,2524,861],{"class":267},[168,2526,345],{"class":263},[168,2528,2529],{"class":170,"line":226},[168,2530,2222],{"class":263},[1434,2532,2533],{"id":2533},"结果辅助函数",[150,2535,2536,2537,472,2540,2543],{},"该模块提供了 ",[165,2538,2539],{},"imageResult",[165,2541,2542],{},"audioResult"," 辅助函数，用于处理工具响应中的二进制媒体（Base64 编码数据加上 MIME 类型）：",[157,2545,2547],{"className":249,"code":2546,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool, imageResult, audioResult } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  description: 'Generate chart',\n  inputSchema: { data: z.array(z.number()) },\n  handler: async ({ data }) => {\n    const base64 = await generateChart(data)\n    return imageResult(base64, 'image\u002Fpng')\n  },\n})\n",[165,2548,2549,2567,2595,2599,2611,2626,2657,2675,2696,2717,2721],{"__ignoreMap":163},[168,2550,2551,2553,2555,2557,2559,2561,2563,2565],{"class":170,"line":171},[168,2552,260],{"class":259},[168,2554,264],{"class":263},[168,2556,268],{"class":267},[168,2558,271],{"class":263},[168,2560,274],{"class":259},[168,2562,277],{"class":263},[168,2564,281],{"class":280},[168,2566,284],{"class":263},[168,2568,2569,2571,2573,2575,2577,2580,2582,2585,2587,2589,2591,2593],{"class":170,"line":177},[168,2570,260],{"class":259},[168,2572,264],{"class":263},[168,2574,293],{"class":267},[168,2576,657],{"class":263},[168,2578,2579],{"class":267}," imageResult",[168,2581,657],{"class":263},[168,2583,2584],{"class":267}," audioResult",[168,2586,271],{"class":263},[168,2588,274],{"class":259},[168,2590,277],{"class":263},[168,2592,302],{"class":280},[168,2594,284],{"class":263},[168,2596,2597],{"class":170,"line":184},[168,2598,181],{"emptyLinePlaceholder":180},[168,2600,2601,2603,2605,2607,2609],{"class":170,"line":190},[168,2602,313],{"class":259},[168,2604,316],{"class":259},[168,2606,293],{"class":319},[168,2608,322],{"class":267},[168,2610,325],{"class":263},[168,2612,2613,2615,2617,2619,2622,2624],{"class":170,"line":196},[168,2614,350],{"class":330},[168,2616,334],{"class":263},[168,2618,277],{"class":263},[168,2620,2621],{"class":280},"Generate chart",[168,2623,342],{"class":263},[168,2625,345],{"class":263},[168,2627,2628,2630,2632,2634,2637,2639,2641,2643,2645,2647,2649,2651,2654],{"class":170,"line":202},[168,2629,366],{"class":330},[168,2631,334],{"class":263},[168,2633,264],{"class":263},[168,2635,2636],{"class":330}," data",[168,2638,334],{"class":263},[168,2640,268],{"class":267},[168,2642,383],{"class":263},[168,2644,1337],{"class":319},[168,2646,1340],{"class":267},[168,2648,383],{"class":263},[168,2650,1144],{"class":319},[168,2652,2653],{"class":267},"()) ",[168,2655,2656],{"class":263},"},\n",[168,2658,2659,2661,2663,2665,2667,2669,2671,2673],{"class":170,"line":208},[168,2660,418],{"class":319},[168,2662,334],{"class":263},[168,2664,424],{"class":423},[168,2666,427],{"class":263},[168,2668,2636],{"class":430},[168,2670,434],{"class":263},[168,2672,437],{"class":423},[168,2674,371],{"class":263},[168,2676,2677,2679,2682,2684,2686,2689,2691,2694],{"class":170,"line":214},[168,2678,1826],{"class":423},[168,2680,2681],{"class":267}," base64",[168,2683,1832],{"class":263},[168,2685,2199],{"class":259},[168,2687,2688],{"class":319}," generateChart",[168,2690,322],{"class":330},[168,2692,2693],{"class":267},"data",[168,2695,462],{"class":330},[168,2697,2698,2700,2702,2704,2707,2709,2711,2713,2715],{"class":170,"line":220},[168,2699,702],{"class":259},[168,2701,2579],{"class":319},[168,2703,322],{"class":330},[168,2705,2706],{"class":267},"base64",[168,2708,657],{"class":263},[168,2710,277],{"class":263},[168,2712,2343],{"class":280},[168,2714,342],{"class":263},[168,2716,462],{"class":330},[168,2718,2719],{"class":170,"line":226},[168,2720,413],{"class":263},[168,2722,2723,2725],{"class":170,"line":232},[168,2724,459],{"class":263},[168,2726,462],{"class":267},[157,2728,2730],{"className":249,"code":2729,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool, audioResult } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  description: 'Text to speech',\n  inputSchema: { text: z.string() },\n  handler: async ({ text }) => {\n    const base64 = await synthesizeSpeech(text)\n    return audioResult(base64, 'audio\u002Fmp3')\n  },\n})\n",[165,2731,2732,2750,2772,2776,2788,2803,2827,2845,2865,2886,2890],{"__ignoreMap":163},[168,2733,2734,2736,2738,2740,2742,2744,2746,2748],{"class":170,"line":171},[168,2735,260],{"class":259},[168,2737,264],{"class":263},[168,2739,268],{"class":267},[168,2741,271],{"class":263},[168,2743,274],{"class":259},[168,2745,277],{"class":263},[168,2747,281],{"class":280},[168,2749,284],{"class":263},[168,2751,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770],{"class":170,"line":177},[168,2753,260],{"class":259},[168,2755,264],{"class":263},[168,2757,293],{"class":267},[168,2759,657],{"class":263},[168,2761,2584],{"class":267},[168,2763,271],{"class":263},[168,2765,274],{"class":259},[168,2767,277],{"class":263},[168,2769,302],{"class":280},[168,2771,284],{"class":263},[168,2773,2774],{"class":170,"line":184},[168,2775,181],{"emptyLinePlaceholder":180},[168,2777,2778,2780,2782,2784,2786],{"class":170,"line":190},[168,2779,313],{"class":259},[168,2781,316],{"class":259},[168,2783,293],{"class":319},[168,2785,322],{"class":267},[168,2787,325],{"class":263},[168,2789,2790,2792,2794,2796,2799,2801],{"class":170,"line":196},[168,2791,350],{"class":330},[168,2793,334],{"class":263},[168,2795,277],{"class":263},[168,2797,2798],{"class":280},"Text to speech",[168,2800,342],{"class":263},[168,2802,345],{"class":263},[168,2804,2805,2807,2809,2811,2814,2816,2818,2820,2822,2825],{"class":170,"line":202},[168,2806,366],{"class":330},[168,2808,334],{"class":263},[168,2810,264],{"class":263},[168,2812,2813],{"class":330}," text",[168,2815,334],{"class":263},[168,2817,268],{"class":267},[168,2819,383],{"class":263},[168,2821,386],{"class":319},[168,2823,2824],{"class":267},"() ",[168,2826,2656],{"class":263},[168,2828,2829,2831,2833,2835,2837,2839,2841,2843],{"class":170,"line":208},[168,2830,418],{"class":319},[168,2832,334],{"class":263},[168,2834,424],{"class":423},[168,2836,427],{"class":263},[168,2838,2813],{"class":430},[168,2840,434],{"class":263},[168,2842,437],{"class":423},[168,2844,371],{"class":263},[168,2846,2847,2849,2851,2853,2855,2858,2860,2863],{"class":170,"line":214},[168,2848,1826],{"class":423},[168,2850,2681],{"class":267},[168,2852,1832],{"class":263},[168,2854,2199],{"class":259},[168,2856,2857],{"class":319}," synthesizeSpeech",[168,2859,322],{"class":330},[168,2861,2862],{"class":267},"text",[168,2864,462],{"class":330},[168,2866,2867,2869,2871,2873,2875,2877,2879,2882,2884],{"class":170,"line":220},[168,2868,702],{"class":259},[168,2870,2584],{"class":319},[168,2872,322],{"class":330},[168,2874,2706],{"class":267},[168,2876,657],{"class":263},[168,2878,277],{"class":263},[168,2880,2881],{"class":280},"audio\u002Fmp3",[168,2883,342],{"class":263},[168,2885,462],{"class":330},[168,2887,2888],{"class":170,"line":226},[168,2889,413],{"class":263},[168,2891,2892,2894],{"class":170,"line":232},[168,2893,459],{"class":263},[168,2895,462],{"class":267},[2897,2898,2901,2067,2904,472,2907,2910,2911,2916],"callout",{"color":2899,"icon":2900},"info","i-lucide-info",[165,2902,2903],{},"textResult",[165,2905,2906],{},"jsonResult",[165,2908,2909],{},"errorResult"," 辅助函数已弃用。请直接从你的 handler 返回值，并在错误情况下抛出错误（参见 ",[2912,2913,2915],"a",{"href":2914},"#error-handling","错误处理","）。",[145,2918,2919],{"id":2919},"工具注解",[150,2921,2922],{},"注解是行为提示，用于告知 MCP 客户端工具的行为方式。客户端可以使用它们来决定何时提示用户进行确认（人在回路）。",[157,2924,2927],{"className":249,"code":2925,"filename":2926,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'delete-user',\n  description: 'Delete a user account',\n  inputSchema: {\n    userId: z.string(),\n  },\n  annotations: {\n    readOnlyHint: false,    \u002F\u002F 工具会修改状态\n    destructiveHint: true,  \u002F\u002F 工具执行破坏性更新\n    idempotentHint: true,   \u002F\u002F 删除同一用户两次不会产生额外影响\n    openWorldHint: false,   \u002F\u002F 工具不与外部系统交互\n  },\n  handler: async ({ userId }) => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fdelete-user.ts",[165,2928,2929,2947,2965,2969,2981,2996,3011,3019,3036,3040,3048,3064,3079,3093,3107,3111,3130,3134,3138],{"__ignoreMap":163},[168,2930,2931,2933,2935,2937,2939,2941,2943,2945],{"class":170,"line":171},[168,2932,260],{"class":259},[168,2934,264],{"class":263},[168,2936,268],{"class":267},[168,2938,271],{"class":263},[168,2940,274],{"class":259},[168,2942,277],{"class":263},[168,2944,281],{"class":280},[168,2946,284],{"class":263},[168,2948,2949,2951,2953,2955,2957,2959,2961,2963],{"class":170,"line":177},[168,2950,260],{"class":259},[168,2952,264],{"class":263},[168,2954,293],{"class":267},[168,2956,271],{"class":263},[168,2958,274],{"class":259},[168,2960,277],{"class":263},[168,2962,302],{"class":280},[168,2964,284],{"class":263},[168,2966,2967],{"class":170,"line":184},[168,2968,181],{"emptyLinePlaceholder":180},[168,2970,2971,2973,2975,2977,2979],{"class":170,"line":190},[168,2972,313],{"class":259},[168,2974,316],{"class":259},[168,2976,293],{"class":319},[168,2978,322],{"class":267},[168,2980,325],{"class":263},[168,2982,2983,2985,2987,2989,2992,2994],{"class":170,"line":196},[168,2984,331],{"class":330},[168,2986,334],{"class":263},[168,2988,277],{"class":263},[168,2990,2991],{"class":280},"delete-user",[168,2993,342],{"class":263},[168,2995,345],{"class":263},[168,2997,2998,3000,3002,3004,3007,3009],{"class":170,"line":202},[168,2999,350],{"class":330},[168,3001,334],{"class":263},[168,3003,277],{"class":263},[168,3005,3006],{"class":280},"Delete a user account",[168,3008,342],{"class":263},[168,3010,345],{"class":263},[168,3012,3013,3015,3017],{"class":170,"line":208},[168,3014,366],{"class":330},[168,3016,334],{"class":263},[168,3018,371],{"class":263},[168,3020,3021,3024,3026,3028,3030,3032,3034],{"class":170,"line":214},[168,3022,3023],{"class":330},"    userId",[168,3025,334],{"class":263},[168,3027,268],{"class":267},[168,3029,383],{"class":263},[168,3031,386],{"class":319},[168,3033,389],{"class":267},[168,3035,345],{"class":263},[168,3037,3038],{"class":170,"line":220},[168,3039,413],{"class":263},[168,3041,3042,3044,3046],{"class":170,"line":226},[168,3043,830],{"class":330},[168,3045,334],{"class":263},[168,3047,371],{"class":263},[168,3049,3050,3053,3055,3059,3061],{"class":170,"line":232},[168,3051,3052],{"class":330},"    readOnlyHint",[168,3054,334],{"class":263},[168,3056,3058],{"class":3057},"sfNiH"," false",[168,3060,657],{"class":263},[168,3062,3063],{"class":521},"    \u002F\u002F 工具会修改状态\n",[168,3065,3066,3069,3071,3074,3076],{"class":170,"line":237},[168,3067,3068],{"class":330},"    destructiveHint",[168,3070,334],{"class":263},[168,3072,3073],{"class":3057}," true",[168,3075,657],{"class":263},[168,3077,3078],{"class":521},"  \u002F\u002F 工具执行破坏性更新\n",[168,3080,3081,3084,3086,3088,3090],{"class":170,"line":1198},[168,3082,3083],{"class":330},"    idempotentHint",[168,3085,334],{"class":263},[168,3087,3073],{"class":3057},[168,3089,657],{"class":263},[168,3091,3092],{"class":521},"   \u002F\u002F 删除同一用户两次不会产生额外影响\n",[168,3094,3095,3098,3100,3102,3104],{"class":170,"line":1203},[168,3096,3097],{"class":330},"    openWorldHint",[168,3099,334],{"class":263},[168,3101,3058],{"class":3057},[168,3103,657],{"class":263},[168,3105,3106],{"class":521},"   \u002F\u002F 工具不与外部系统交互\n",[168,3108,3109],{"class":170,"line":1209},[168,3110,413],{"class":263},[168,3112,3113,3115,3117,3119,3121,3124,3126,3128],{"class":170,"line":1249},[168,3114,418],{"class":319},[168,3116,334],{"class":263},[168,3118,424],{"class":423},[168,3120,427],{"class":263},[168,3122,3123],{"class":430}," userId",[168,3125,434],{"class":263},[168,3127,437],{"class":423},[168,3129,371],{"class":263},[168,3131,3132],{"class":170,"line":1254},[168,3133,567],{"class":521},[168,3135,3136],{"class":170,"line":1260},[168,3137,413],{"class":263},[168,3139,3140,3142],{"class":170,"line":1314},[168,3141,459],{"class":263},[168,3143,462],{"class":267},[1434,3145,3146],{"id":3146},"注解参考",[1439,3148,3149,3164],{},[1442,3150,3151],{},[1445,3152,3153,3156,3159,3162],{},[1448,3154,3155],{},"注解",[1448,3157,3158],{},"类型",[1448,3160,3161],{},"默认值",[1448,3163,1455],{},[1457,3165,3166,3189,3215,3239],{},[1445,3167,3168,3173,3177,3182],{},[1462,3169,3170],{},[165,3171,3172],{},"readOnlyHint",[1462,3174,3175],{},[165,3176,2072],{},[1462,3178,3179],{},[165,3180,3181],{},"false",[1462,3183,3184,3185,3188],{},"如果为 ",[165,3186,3187],{},"true","，工具仅读取数据而不修改任何状态（可安全重试）。",[1445,3190,3191,3196,3200,3204],{},[1462,3192,3193],{},[165,3194,3195],{},"destructiveHint",[1462,3197,3198],{},[165,3199,2072],{},[1462,3201,3202],{},[165,3203,3187],{},[1462,3205,3184,3206,3208,3209,3211,3212,3214],{},[165,3207,3187],{},"，工具可能会执行删除数据等破坏性操作。仅在 ",[165,3210,3172],{}," 为 ",[165,3213,3181],{}," 时有意义。",[1445,3216,3217,3222,3226,3230],{},[1462,3218,3219],{},[165,3220,3221],{},"idempotentHint",[1462,3223,3224],{},[165,3225,2072],{},[1462,3227,3228],{},[165,3229,3181],{},[1462,3231,3184,3232,3234,3235,3211,3237,3214],{},[165,3233,3187],{},"，使用相同参数多次调用工具不会产生超出第一次调用的额外效果。仅在 ",[165,3236,3172],{},[165,3238,3181],{},[1445,3240,3241,3246,3250,3254],{},[1462,3242,3243],{},[165,3244,3245],{},"openWorldHint",[1462,3247,3248],{},[165,3249,2072],{},[1462,3251,3252],{},[165,3253,3187],{},[1462,3255,3184,3256,3258,3259,3261],{},[165,3257,3187],{},"，工具可能会与外部世界交互（外部 API、互联网）。如果为 ",[165,3260,3181],{},"，它仅操作本地\u002F内部数据。",[150,3263,3264],{},"以下是典型工具的常见注解模式：",[622,3266,3267,3324,3388,3451],{},[157,3268,3271],{"className":249,"code":3269,"filename":3270,"language":252,"meta":163,"style":163},"\u002F\u002F 搜索、列表、查找、计算...\nannotations: {\n  readOnlyHint: true,\n  destructiveHint: false,\n  openWorldHint: false,\n}\n","只读工具",[165,3272,3273,3278,3287,3298,3309,3320],{"__ignoreMap":163},[168,3274,3275],{"class":170,"line":171},[168,3276,3277],{"class":521},"\u002F\u002F 搜索、列表、查找、计算...\n",[168,3279,3280,3283,3285],{"class":170,"line":177},[168,3281,3282],{"class":2090},"annotations",[168,3284,334],{"class":263},[168,3286,371],{"class":263},[168,3288,3289,3292,3294,3296],{"class":170,"line":184},[168,3290,3291],{"class":2090},"  readOnlyHint",[168,3293,334],{"class":263},[168,3295,3073],{"class":3057},[168,3297,345],{"class":263},[168,3299,3300,3303,3305,3307],{"class":170,"line":190},[168,3301,3302],{"class":2090},"  destructiveHint",[168,3304,334],{"class":263},[168,3306,3058],{"class":3057},[168,3308,345],{"class":263},[168,3310,3311,3314,3316,3318],{"class":170,"line":196},[168,3312,3313],{"class":2090},"  openWorldHint",[168,3315,334],{"class":263},[168,3317,3058],{"class":3057},[168,3319,345],{"class":263},[168,3321,3322],{"class":170,"line":202},[168,3323,2222],{"class":263},[157,3325,3328],{"className":249,"code":3326,"filename":3327,"language":252,"meta":163,"style":163},"\u002F\u002F 每次创建一条新记录\nannotations: {\n  readOnlyHint: false,\n  destructiveHint: false,\n  idempotentHint: false,\n  openWorldHint: false,\n}\n","创建工具",[165,3329,3330,3335,3343,3353,3363,3374,3384],{"__ignoreMap":163},[168,3331,3332],{"class":170,"line":171},[168,3333,3334],{"class":521},"\u002F\u002F 每次创建一条新记录\n",[168,3336,3337,3339,3341],{"class":170,"line":177},[168,3338,3282],{"class":2090},[168,3340,334],{"class":263},[168,3342,371],{"class":263},[168,3344,3345,3347,3349,3351],{"class":170,"line":184},[168,3346,3291],{"class":2090},[168,3348,334],{"class":263},[168,3350,3058],{"class":3057},[168,3352,345],{"class":263},[168,3354,3355,3357,3359,3361],{"class":170,"line":190},[168,3356,3302],{"class":2090},[168,3358,334],{"class":263},[168,3360,3058],{"class":3057},[168,3362,345],{"class":263},[168,3364,3365,3368,3370,3372],{"class":170,"line":196},[168,3366,3367],{"class":2090},"  idempotentHint",[168,3369,334],{"class":263},[168,3371,3058],{"class":3057},[168,3373,345],{"class":263},[168,3375,3376,3378,3380,3382],{"class":170,"line":202},[168,3377,3313],{"class":2090},[168,3379,334],{"class":263},[168,3381,3058],{"class":3057},[168,3383,345],{"class":263},[168,3385,3386],{"class":170,"line":208},[168,3387,2222],{"class":263},[157,3389,3392],{"className":249,"code":3390,"filename":3391,"language":252,"meta":163,"style":163},"\u002F\u002F 更新是幂等的（相同输入 → 相同结果）\nannotations: {\n  readOnlyHint: false,\n  destructiveHint: false,\n  idempotentHint: true,\n  openWorldHint: false,\n}\n","更新工具",[165,3393,3394,3399,3407,3417,3427,3437,3447],{"__ignoreMap":163},[168,3395,3396],{"class":170,"line":171},[168,3397,3398],{"class":521},"\u002F\u002F 更新是幂等的（相同输入 → 相同结果）\n",[168,3400,3401,3403,3405],{"class":170,"line":177},[168,3402,3282],{"class":2090},[168,3404,334],{"class":263},[168,3406,371],{"class":263},[168,3408,3409,3411,3413,3415],{"class":170,"line":184},[168,3410,3291],{"class":2090},[168,3412,334],{"class":263},[168,3414,3058],{"class":3057},[168,3416,345],{"class":263},[168,3418,3419,3421,3423,3425],{"class":170,"line":190},[168,3420,3302],{"class":2090},[168,3422,334],{"class":263},[168,3424,3058],{"class":3057},[168,3426,345],{"class":263},[168,3428,3429,3431,3433,3435],{"class":170,"line":196},[168,3430,3367],{"class":2090},[168,3432,334],{"class":263},[168,3434,3073],{"class":3057},[168,3436,345],{"class":263},[168,3438,3439,3441,3443,3445],{"class":170,"line":202},[168,3440,3313],{"class":2090},[168,3442,334],{"class":263},[168,3444,3058],{"class":3057},[168,3446,345],{"class":263},[168,3448,3449],{"class":170,"line":208},[168,3450,2222],{"class":263},[157,3452,3455],{"className":249,"code":3453,"filename":3454,"language":252,"meta":163,"style":163},"\u002F\u002F 破坏性且幂等（删除两次效果相同）\nannotations: {\n  readOnlyHint: false,\n  destructiveHint: true,\n  idempotentHint: true,\n  openWorldHint: false,\n}\n","删除工具",[165,3456,3457,3462,3470,3480,3490,3500,3510],{"__ignoreMap":163},[168,3458,3459],{"class":170,"line":171},[168,3460,3461],{"class":521},"\u002F\u002F 破坏性且幂等（删除两次效果相同）\n",[168,3463,3464,3466,3468],{"class":170,"line":177},[168,3465,3282],{"class":2090},[168,3467,334],{"class":263},[168,3469,371],{"class":263},[168,3471,3472,3474,3476,3478],{"class":170,"line":184},[168,3473,3291],{"class":2090},[168,3475,334],{"class":263},[168,3477,3058],{"class":3057},[168,3479,345],{"class":263},[168,3481,3482,3484,3486,3488],{"class":170,"line":190},[168,3483,3302],{"class":2090},[168,3485,334],{"class":263},[168,3487,3073],{"class":3057},[168,3489,345],{"class":263},[168,3491,3492,3494,3496,3498],{"class":170,"line":196},[168,3493,3367],{"class":2090},[168,3495,334],{"class":263},[168,3497,3073],{"class":3057},[168,3499,345],{"class":263},[168,3501,3502,3504,3506,3508],{"class":170,"line":202},[168,3503,3313],{"class":2090},[168,3505,334],{"class":263},[168,3507,3058],{"class":3057},[168,3509,345],{"class":263},[168,3511,3512],{"class":170,"line":208},[168,3513,2222],{"class":263},[2897,3515,3516,3517,3521],{"color":2899,"icon":2900},"所有注解均为",[3518,3519,3520],"strong",{},"提示"," —— 不保证每个 MCP 客户端都会遵守。客户端绝不应基于来自不受信任服务器的注解做出安全关键决策。",[145,3523,3524],{"id":3524},"输入示例",[150,3526,3527,3528,3531,3532,3534,3535,3538],{},"你可以使用 ",[165,3529,3530],{},"inputExamples"," 为你的工具提供具体的使用示例。这些示例是类型安全的（与你的 ",[165,3533,903],{}," 匹配），并通过 ",[165,3536,3537],{},"_meta.inputExamples"," 传输给客户端。",[150,3540,3541],{},"输入示例有助于 AI 模型理解如何正确填写工具参数，特别是对于包含可选字段或复杂输入的工具。",[157,3543,3546],{"className":249,"code":3544,"filename":3545,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  description: 'Create a new todo',\n  inputSchema: {\n    title: z.string().describe('The title of the todo'),\n    content: z.string().optional().describe('Optional description'),\n  },\n  inputExamples: [\n    { title: 'Buy groceries', content: 'Milk, eggs, bread' },\n    { title: 'Fix login bug' },  \u002F\u002F content 是可选的\n  ],\n  handler: async ({ title, content }) => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fcreate-todo.ts",[165,3547,3548,3566,3584,3588,3600,3615,3623,3655,3693,3697,3706,3739,3759,3766,3788,3792,3796],{"__ignoreMap":163},[168,3549,3550,3552,3554,3556,3558,3560,3562,3564],{"class":170,"line":171},[168,3551,260],{"class":259},[168,3553,264],{"class":263},[168,3555,268],{"class":267},[168,3557,271],{"class":263},[168,3559,274],{"class":259},[168,3561,277],{"class":263},[168,3563,281],{"class":280},[168,3565,284],{"class":263},[168,3567,3568,3570,3572,3574,3576,3578,3580,3582],{"class":170,"line":177},[168,3569,260],{"class":259},[168,3571,264],{"class":263},[168,3573,293],{"class":267},[168,3575,271],{"class":263},[168,3577,274],{"class":259},[168,3579,277],{"class":263},[168,3581,302],{"class":280},[168,3583,284],{"class":263},[168,3585,3586],{"class":170,"line":184},[168,3587,181],{"emptyLinePlaceholder":180},[168,3589,3590,3592,3594,3596,3598],{"class":170,"line":190},[168,3591,313],{"class":259},[168,3593,316],{"class":259},[168,3595,293],{"class":319},[168,3597,322],{"class":267},[168,3599,325],{"class":263},[168,3601,3602,3604,3606,3608,3611,3613],{"class":170,"line":196},[168,3603,350],{"class":330},[168,3605,334],{"class":263},[168,3607,277],{"class":263},[168,3609,3610],{"class":280},"Create a new todo",[168,3612,342],{"class":263},[168,3614,345],{"class":263},[168,3616,3617,3619,3621],{"class":170,"line":202},[168,3618,366],{"class":330},[168,3620,334],{"class":263},[168,3622,371],{"class":263},[168,3624,3625,3628,3630,3632,3634,3636,3638,3640,3642,3644,3646,3649,3651,3653],{"class":170,"line":208},[168,3626,3627],{"class":330},"    title",[168,3629,334],{"class":263},[168,3631,268],{"class":267},[168,3633,383],{"class":263},[168,3635,386],{"class":319},[168,3637,389],{"class":267},[168,3639,383],{"class":263},[168,3641,394],{"class":319},[168,3643,322],{"class":267},[168,3645,342],{"class":263},[168,3647,3648],{"class":280},"The title of the todo",[168,3650,342],{"class":263},[168,3652,406],{"class":267},[168,3654,345],{"class":263},[168,3656,3657,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680,3682,3684,3687,3689,3691],{"class":170,"line":214},[168,3658,3659],{"class":330},"    content",[168,3661,334],{"class":263},[168,3663,268],{"class":267},[168,3665,383],{"class":263},[168,3667,386],{"class":319},[168,3669,389],{"class":267},[168,3671,383],{"class":263},[168,3673,1227],{"class":319},[168,3675,389],{"class":267},[168,3677,383],{"class":263},[168,3679,394],{"class":319},[168,3681,322],{"class":267},[168,3683,342],{"class":263},[168,3685,3686],{"class":280},"Optional description",[168,3688,342],{"class":263},[168,3690,406],{"class":267},[168,3692,345],{"class":263},[168,3694,3695],{"class":170,"line":220},[168,3696,413],{"class":263},[168,3698,3699,3701,3703],{"class":170,"line":226},[168,3700,846],{"class":330},[168,3702,334],{"class":263},[168,3704,3705],{"class":267}," [\n",[168,3707,3708,3711,3714,3716,3718,3721,3723,3725,3728,3730,3732,3735,3737],{"class":170,"line":232},[168,3709,3710],{"class":263},"    {",[168,3712,3713],{"class":330}," title",[168,3715,334],{"class":263},[168,3717,277],{"class":263},[168,3719,3720],{"class":280},"Buy groceries",[168,3722,342],{"class":263},[168,3724,657],{"class":263},[168,3726,3727],{"class":330}," content",[168,3729,334],{"class":263},[168,3731,277],{"class":263},[168,3733,3734],{"class":280},"Milk, eggs, bread",[168,3736,342],{"class":263},[168,3738,889],{"class":263},[168,3740,3741,3743,3745,3747,3749,3752,3754,3756],{"class":170,"line":237},[168,3742,3710],{"class":263},[168,3744,3713],{"class":330},[168,3746,334],{"class":263},[168,3748,277],{"class":263},[168,3750,3751],{"class":280},"Fix login bug",[168,3753,342],{"class":263},[168,3755,674],{"class":263},[168,3757,3758],{"class":521},"  \u002F\u002F content 是可选的\n",[168,3760,3761,3764],{"class":170,"line":1198},[168,3762,3763],{"class":267},"  ]",[168,3765,345],{"class":263},[168,3767,3768,3770,3772,3774,3776,3778,3780,3782,3784,3786],{"class":170,"line":1203},[168,3769,418],{"class":319},[168,3771,334],{"class":263},[168,3773,424],{"class":423},[168,3775,427],{"class":263},[168,3777,3713],{"class":430},[168,3779,657],{"class":263},[168,3781,3727],{"class":430},[168,3783,434],{"class":263},[168,3785,437],{"class":423},[168,3787,371],{"class":263},[168,3789,3790],{"class":170,"line":1209},[168,3791,567],{"class":521},[168,3793,3794],{"class":170,"line":1249},[168,3795,413],{"class":263},[168,3797,3798,3800],{"class":170,"line":1254},[168,3799,459],{"class":263},[168,3801,462],{"class":267},[2897,3803,3805,3807],{"color":3804,"icon":129},"warning",[165,3806,3530],{}," 对于包含可选参数、枚举或复杂嵌套输入的工具特别有用，展示具体值有助于模型选择正确的格式。",[145,3809,2915],{"id":2915},[150,3811,3812,3813,3816],{},"直接从你的处理程序中抛出错误——就像在 Nitro 事件处理程序中一样。抛出的错误会被自动捕获并转换为符合 MCP 规范的 ",[165,3814,3815],{},"isError"," 结果。",[1434,3818,3820],{"id":3819},"h3-错误推荐","H3 错误（推荐）",[150,3822,3823,3824,3827],{},"使用 H3 的 ",[165,3825,3826],{},"createError()"," 来处理带有状态码的错误：",[157,3829,3832],{"className":249,"code":3830,"filename":3831,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { createError } from 'h3'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'get-user',\n  description: 'Get a user by ID',\n  inputSchema: {\n    id: z.string(),\n  },\n  handler: async ({ id }) => {\n    const user = await findUser(id)\n    if (!user) {\n      throw createError({ statusCode: 404, message: 'User not found' })\n    }\n    return user\n  },\n})\n\u002F\u002F 错误结果：{ isError: true, content: [{ type: 'text', text: '[404] User not found' }] }\n","server\u002Fmcp\u002Ftools\u002Fget-user.ts",[165,3833,3834,3852,3871,3889,3893,3905,3920,3935,3943,3960,3964,3982,4001,4017,4053,4057,4063,4067,4073],{"__ignoreMap":163},[168,3835,3836,3838,3840,3842,3844,3846,3848,3850],{"class":170,"line":171},[168,3837,260],{"class":259},[168,3839,264],{"class":263},[168,3841,268],{"class":267},[168,3843,271],{"class":263},[168,3845,274],{"class":259},[168,3847,277],{"class":263},[168,3849,281],{"class":280},[168,3851,284],{"class":263},[168,3853,3854,3856,3858,3861,3863,3865,3867,3869],{"class":170,"line":177},[168,3855,260],{"class":259},[168,3857,264],{"class":263},[168,3859,3860],{"class":267}," createError",[168,3862,271],{"class":263},[168,3864,274],{"class":259},[168,3866,277],{"class":263},[168,3868,1434],{"class":280},[168,3870,284],{"class":263},[168,3872,3873,3875,3877,3879,3881,3883,3885,3887],{"class":170,"line":184},[168,3874,260],{"class":259},[168,3876,264],{"class":263},[168,3878,293],{"class":267},[168,3880,271],{"class":263},[168,3882,274],{"class":259},[168,3884,277],{"class":263},[168,3886,302],{"class":280},[168,3888,284],{"class":263},[168,3890,3891],{"class":170,"line":190},[168,3892,181],{"emptyLinePlaceholder":180},[168,3894,3895,3897,3899,3901,3903],{"class":170,"line":196},[168,3896,313],{"class":259},[168,3898,316],{"class":259},[168,3900,293],{"class":319},[168,3902,322],{"class":267},[168,3904,325],{"class":263},[168,3906,3907,3909,3911,3913,3916,3918],{"class":170,"line":202},[168,3908,331],{"class":330},[168,3910,334],{"class":263},[168,3912,277],{"class":263},[168,3914,3915],{"class":280},"get-user",[168,3917,342],{"class":263},[168,3919,345],{"class":263},[168,3921,3922,3924,3926,3928,3931,3933],{"class":170,"line":208},[168,3923,350],{"class":330},[168,3925,334],{"class":263},[168,3927,277],{"class":263},[168,3929,3930],{"class":280},"Get a user by ID",[168,3932,342],{"class":263},[168,3934,345],{"class":263},[168,3936,3937,3939,3941],{"class":170,"line":214},[168,3938,366],{"class":330},[168,3940,334],{"class":263},[168,3942,371],{"class":263},[168,3944,3945,3948,3950,3952,3954,3956,3958],{"class":170,"line":220},[168,3946,3947],{"class":330},"    id",[168,3949,334],{"class":263},[168,3951,268],{"class":267},[168,3953,383],{"class":263},[168,3955,386],{"class":319},[168,3957,389],{"class":267},[168,3959,345],{"class":263},[168,3961,3962],{"class":170,"line":226},[168,3963,413],{"class":263},[168,3965,3966,3968,3970,3972,3974,3976,3978,3980],{"class":170,"line":232},[168,3967,418],{"class":319},[168,3969,334],{"class":263},[168,3971,424],{"class":423},[168,3973,427],{"class":263},[168,3975,2180],{"class":430},[168,3977,434],{"class":263},[168,3979,437],{"class":423},[168,3981,371],{"class":263},[168,3983,3984,3986,3988,3990,3992,3995,3997,3999],{"class":170,"line":237},[168,3985,1826],{"class":423},[168,3987,2194],{"class":267},[168,3989,1832],{"class":263},[168,3991,2199],{"class":259},[168,3993,3994],{"class":319}," findUser",[168,3996,322],{"class":330},[168,3998,2207],{"class":267},[168,4000,462],{"class":330},[168,4002,4003,4005,4007,4010,4013,4015],{"class":170,"line":1198},[168,4004,1871],{"class":259},[168,4006,688],{"class":330},[168,4008,4009],{"class":263},"!",[168,4011,4012],{"class":267},"user",[168,4014,1886],{"class":330},[168,4016,325],{"class":263},[168,4018,4019,4022,4024,4026,4028,4031,4033,4036,4038,4040,4042,4044,4047,4049,4051],{"class":170,"line":1203},[168,4020,4021],{"class":259},"      throw",[168,4023,3860],{"class":319},[168,4025,322],{"class":330},[168,4027,854],{"class":263},[168,4029,4030],{"class":330}," statusCode",[168,4032,334],{"class":263},[168,4034,4035],{"class":1882}," 404",[168,4037,657],{"class":263},[168,4039,431],{"class":330},[168,4041,334],{"class":263},[168,4043,277],{"class":263},[168,4045,4046],{"class":280},"User not found",[168,4048,342],{"class":263},[168,4050,271],{"class":263},[168,4052,462],{"class":330},[168,4054,4055],{"class":170,"line":1209},[168,4056,2027],{"class":263},[168,4058,4059,4061],{"class":170,"line":1249},[168,4060,702],{"class":259},[168,4062,2217],{"class":267},[168,4064,4065],{"class":170,"line":1254},[168,4066,413],{"class":263},[168,4068,4069,4071],{"class":170,"line":1260},[168,4070,459],{"class":263},[168,4072,462],{"class":267},[168,4074,4075],{"class":170,"line":1314},[168,4076,4077],{"class":521},"\u002F\u002F 错误结果：{ isError: true, content: [{ type: 'text', text: '[404] User not found' }] }\n",[150,4079,4080],{},"H3 错误还可以包含结构化数据：",[157,4082,4084],{"className":249,"code":4083,"language":252,"meta":163,"style":163},"throw createError({\n  statusCode: 400,\n  message: 'Validation failed',\n  data: { fields: ['name', 'email'] },\n})\n\u002F\u002F 错误文本：'[400] Validation failed\\n{ \"fields\": [\"name\", \"email\"] }'\n",[165,4085,4086,4097,4109,4125,4161,4167],{"__ignoreMap":163},[168,4087,4088,4091,4093,4095],{"class":170,"line":171},[168,4089,4090],{"class":259},"throw",[168,4092,3860],{"class":319},[168,4094,322],{"class":267},[168,4096,325],{"class":263},[168,4098,4099,4102,4104,4107],{"class":170,"line":177},[168,4100,4101],{"class":330},"  statusCode",[168,4103,334],{"class":263},[168,4105,4106],{"class":1882}," 400",[168,4108,345],{"class":263},[168,4110,4111,4114,4116,4118,4121,4123],{"class":170,"line":184},[168,4112,4113],{"class":330},"  message",[168,4115,334],{"class":263},[168,4117,277],{"class":263},[168,4119,4120],{"class":280},"Validation failed",[168,4122,342],{"class":263},[168,4124,345],{"class":263},[168,4126,4127,4130,4132,4134,4137,4139,4141,4143,4145,4147,4149,4151,4154,4156,4159],{"class":170,"line":190},[168,4128,4129],{"class":330},"  data",[168,4131,334],{"class":263},[168,4133,264],{"class":263},[168,4135,4136],{"class":330}," fields",[168,4138,334],{"class":263},[168,4140,851],{"class":267},[168,4142,342],{"class":263},[168,4144,471],{"class":280},[168,4146,342],{"class":263},[168,4148,657],{"class":263},[168,4150,277],{"class":263},[168,4152,4153],{"class":280},"email",[168,4155,342],{"class":263},[168,4157,4158],{"class":267},"] ",[168,4160,2656],{"class":263},[168,4162,4163,4165],{"class":170,"line":196},[168,4164,459],{"class":263},[168,4166,462],{"class":267},[168,4168,4169],{"class":170,"line":202},[168,4170,4171],{"class":521},"\u002F\u002F 错误文本：'[400] Validation failed\\n{ \"fields\": [\"name\", \"email\"] }'\n",[1434,4173,4174],{"id":4174},"普通错误",[150,4176,4177,4178,4181],{},"普通的 ",[165,4179,4180],{},"Error"," 实例同样适用：",[157,4183,4186],{"className":249,"code":4184,"filename":4185,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'safe-divide',\n  inputSchema: {\n    a: z.number(),\n    b: z.number(),\n  },\n  handler: async ({ a, b }) => {\n    if (b === 0) throw new Error('Division by zero')\n    return a \u002F b\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fsafe-divide.ts",[165,4187,4188,4206,4224,4228,4240,4255,4263,4279,4295,4299,4321,4357,4367,4371],{"__ignoreMap":163},[168,4189,4190,4192,4194,4196,4198,4200,4202,4204],{"class":170,"line":171},[168,4191,260],{"class":259},[168,4193,264],{"class":263},[168,4195,268],{"class":267},[168,4197,271],{"class":263},[168,4199,274],{"class":259},[168,4201,277],{"class":263},[168,4203,281],{"class":280},[168,4205,284],{"class":263},[168,4207,4208,4210,4212,4214,4216,4218,4220,4222],{"class":170,"line":177},[168,4209,260],{"class":259},[168,4211,264],{"class":263},[168,4213,293],{"class":267},[168,4215,271],{"class":263},[168,4217,274],{"class":259},[168,4219,277],{"class":263},[168,4221,302],{"class":280},[168,4223,284],{"class":263},[168,4225,4226],{"class":170,"line":184},[168,4227,181],{"emptyLinePlaceholder":180},[168,4229,4230,4232,4234,4236,4238],{"class":170,"line":190},[168,4231,313],{"class":259},[168,4233,316],{"class":259},[168,4235,293],{"class":319},[168,4237,322],{"class":267},[168,4239,325],{"class":263},[168,4241,4242,4244,4246,4248,4251,4253],{"class":170,"line":196},[168,4243,331],{"class":330},[168,4245,334],{"class":263},[168,4247,277],{"class":263},[168,4249,4250],{"class":280},"safe-divide",[168,4252,342],{"class":263},[168,4254,345],{"class":263},[168,4256,4257,4259,4261],{"class":170,"line":202},[168,4258,366],{"class":330},[168,4260,334],{"class":263},[168,4262,371],{"class":263},[168,4264,4265,4267,4269,4271,4273,4275,4277],{"class":170,"line":208},[168,4266,1135],{"class":330},[168,4268,334],{"class":263},[168,4270,268],{"class":267},[168,4272,383],{"class":263},[168,4274,1144],{"class":319},[168,4276,389],{"class":267},[168,4278,345],{"class":263},[168,4280,4281,4283,4285,4287,4289,4291,4293],{"class":170,"line":214},[168,4282,1168],{"class":330},[168,4284,334],{"class":263},[168,4286,268],{"class":267},[168,4288,383],{"class":263},[168,4290,1144],{"class":319},[168,4292,389],{"class":267},[168,4294,345],{"class":263},[168,4296,4297],{"class":170,"line":220},[168,4298,413],{"class":263},[168,4300,4301,4303,4305,4307,4309,4311,4313,4315,4317,4319],{"class":170,"line":226},[168,4302,418],{"class":319},[168,4304,334],{"class":263},[168,4306,424],{"class":423},[168,4308,427],{"class":263},[168,4310,1388],{"class":430},[168,4312,657],{"class":263},[168,4314,1393],{"class":430},[168,4316,434],{"class":263},[168,4318,437],{"class":423},[168,4320,371],{"class":263},[168,4322,4323,4325,4327,4330,4333,4336,4338,4340,4343,4346,4348,4350,4353,4355],{"class":170,"line":232},[168,4324,1871],{"class":259},[168,4326,688],{"class":330},[168,4328,4329],{"class":267},"b",[168,4331,4332],{"class":263}," ===",[168,4334,4335],{"class":1882}," 0",[168,4337,1886],{"class":330},[168,4339,4090],{"class":259},[168,4341,4342],{"class":263}," new",[168,4344,4345],{"class":319}," Error",[168,4347,322],{"class":330},[168,4349,342],{"class":263},[168,4351,4352],{"class":280},"Division by zero",[168,4354,342],{"class":263},[168,4356,462],{"class":330},[168,4358,4359,4361,4363,4365],{"class":170,"line":237},[168,4360,702],{"class":259},[168,4362,1388],{"class":267},[168,4364,1837],{"class":263},[168,4366,2156],{"class":267},[168,4368,4369],{"class":170,"line":1198},[168,4370,413],{"class":263},[168,4372,4373,4375],{"class":170,"line":1203},[168,4374,459],{"class":263},[168,4376,462],{"class":267},[145,4378,4379],{"id":4379},"响应缓存",[150,4381,4382,4383,4386],{},"你可以使用 Nitro 的缓存系统来缓存工具响应。",[165,4384,4385],{},"cache"," 选项接受三种格式：",[1434,4388,4389],{"id":4389},"简单时长",[150,4391,4392,4393,4401],{},"使用字符串时长（由 ",[2912,4394,4398],{"href":4395,"rel":4396},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fms",[4397],"nofollow",[165,4399,4400],{},"ms"," 解析）或毫秒数：",[157,4403,4406],{"className":249,"code":4404,"filename":4405,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  description: 'Fetch data with 1 hour cache',\n  inputSchema: {\n    id: z.string(),\n  },\n  cache: '1h', \u002F\u002F 或 '30m'、'2 days'、3600000 等\n  handler: async ({ id }) => {\n    return await fetchExpensiveData(id)\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fcached-data.ts",[165,4407,4408,4426,4444,4448,4460,4475,4483,4499,4503,4522,4540,4555,4559],{"__ignoreMap":163},[168,4409,4410,4412,4414,4416,4418,4420,4422,4424],{"class":170,"line":171},[168,4411,260],{"class":259},[168,4413,264],{"class":263},[168,4415,268],{"class":267},[168,4417,271],{"class":263},[168,4419,274],{"class":259},[168,4421,277],{"class":263},[168,4423,281],{"class":280},[168,4425,284],{"class":263},[168,4427,4428,4430,4432,4434,4436,4438,4440,4442],{"class":170,"line":177},[168,4429,260],{"class":259},[168,4431,264],{"class":263},[168,4433,293],{"class":267},[168,4435,271],{"class":263},[168,4437,274],{"class":259},[168,4439,277],{"class":263},[168,4441,302],{"class":280},[168,4443,284],{"class":263},[168,4445,4446],{"class":170,"line":184},[168,4447,181],{"emptyLinePlaceholder":180},[168,4449,4450,4452,4454,4456,4458],{"class":170,"line":190},[168,4451,313],{"class":259},[168,4453,316],{"class":259},[168,4455,293],{"class":319},[168,4457,322],{"class":267},[168,4459,325],{"class":263},[168,4461,4462,4464,4466,4468,4471,4473],{"class":170,"line":196},[168,4463,350],{"class":330},[168,4465,334],{"class":263},[168,4467,277],{"class":263},[168,4469,4470],{"class":280},"Fetch data with 1 hour cache",[168,4472,342],{"class":263},[168,4474,345],{"class":263},[168,4476,4477,4479,4481],{"class":170,"line":202},[168,4478,366],{"class":330},[168,4480,334],{"class":263},[168,4482,371],{"class":263},[168,4484,4485,4487,4489,4491,4493,4495,4497],{"class":170,"line":208},[168,4486,3947],{"class":330},[168,4488,334],{"class":263},[168,4490,268],{"class":267},[168,4492,383],{"class":263},[168,4494,386],{"class":319},[168,4496,389],{"class":267},[168,4498,345],{"class":263},[168,4500,4501],{"class":170,"line":214},[168,4502,413],{"class":263},[168,4504,4505,4508,4510,4512,4515,4517,4519],{"class":170,"line":220},[168,4506,4507],{"class":330},"  cache",[168,4509,334],{"class":263},[168,4511,277],{"class":263},[168,4513,4514],{"class":280},"1h",[168,4516,342],{"class":263},[168,4518,657],{"class":263},[168,4520,4521],{"class":521}," \u002F\u002F 或 '30m'、'2 days'、3600000 等\n",[168,4523,4524,4526,4528,4530,4532,4534,4536,4538],{"class":170,"line":226},[168,4525,418],{"class":319},[168,4527,334],{"class":263},[168,4529,424],{"class":423},[168,4531,427],{"class":263},[168,4533,2180],{"class":430},[168,4535,434],{"class":263},[168,4537,437],{"class":423},[168,4539,371],{"class":263},[168,4541,4542,4544,4546,4549,4551,4553],{"class":170,"line":232},[168,4543,702],{"class":259},[168,4545,2199],{"class":259},[168,4547,4548],{"class":319}," fetchExpensiveData",[168,4550,322],{"class":330},[168,4552,2207],{"class":267},[168,4554,462],{"class":330},[168,4556,4557],{"class":170,"line":237},[168,4558,413],{"class":263},[168,4560,4561,4563],{"class":170,"line":1198},[168,4562,459],{"class":263},[168,4564,462],{"class":267},[1434,4566,4567],{"id":4567},"完整缓存选项",[150,4569,4570],{},"如需更多控制，请使用包含所有 Nitro 缓存选项的对象：",[157,4572,4575],{"className":249,"code":4573,"filename":4574,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  description: 'Get page with custom cache key',\n  inputSchema: {\n    path: z.string(),\n  },\n  cache: {\n    maxAge: '1h',\n    getKey: args => `page-${args.path}`,\n    swr: true, \u002F\u002F stale-while-revalidate\n  },\n  handler: async ({ path }) => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fcached-pages.ts",[165,4576,4577,4595,4613,4617,4629,4644,4652,4669,4673,4681,4696,4726,4740,4744,4763,4767,4771],{"__ignoreMap":163},[168,4578,4579,4581,4583,4585,4587,4589,4591,4593],{"class":170,"line":171},[168,4580,260],{"class":259},[168,4582,264],{"class":263},[168,4584,268],{"class":267},[168,4586,271],{"class":263},[168,4588,274],{"class":259},[168,4590,277],{"class":263},[168,4592,281],{"class":280},[168,4594,284],{"class":263},[168,4596,4597,4599,4601,4603,4605,4607,4609,4611],{"class":170,"line":177},[168,4598,260],{"class":259},[168,4600,264],{"class":263},[168,4602,293],{"class":267},[168,4604,271],{"class":263},[168,4606,274],{"class":259},[168,4608,277],{"class":263},[168,4610,302],{"class":280},[168,4612,284],{"class":263},[168,4614,4615],{"class":170,"line":184},[168,4616,181],{"emptyLinePlaceholder":180},[168,4618,4619,4621,4623,4625,4627],{"class":170,"line":190},[168,4620,313],{"class":259},[168,4622,316],{"class":259},[168,4624,293],{"class":319},[168,4626,322],{"class":267},[168,4628,325],{"class":263},[168,4630,4631,4633,4635,4637,4640,4642],{"class":170,"line":196},[168,4632,350],{"class":330},[168,4634,334],{"class":263},[168,4636,277],{"class":263},[168,4638,4639],{"class":280},"Get page with custom cache key",[168,4641,342],{"class":263},[168,4643,345],{"class":263},[168,4645,4646,4648,4650],{"class":170,"line":202},[168,4647,366],{"class":330},[168,4649,334],{"class":263},[168,4651,371],{"class":263},[168,4653,4654,4657,4659,4661,4663,4665,4667],{"class":170,"line":208},[168,4655,4656],{"class":330},"    path",[168,4658,334],{"class":263},[168,4660,268],{"class":267},[168,4662,383],{"class":263},[168,4664,386],{"class":319},[168,4666,389],{"class":267},[168,4668,345],{"class":263},[168,4670,4671],{"class":170,"line":214},[168,4672,413],{"class":263},[168,4674,4675,4677,4679],{"class":170,"line":220},[168,4676,4507],{"class":330},[168,4678,334],{"class":263},[168,4680,371],{"class":263},[168,4682,4683,4686,4688,4690,4692,4694],{"class":170,"line":226},[168,4684,4685],{"class":330},"    maxAge",[168,4687,334],{"class":263},[168,4689,277],{"class":263},[168,4691,4514],{"class":280},[168,4693,342],{"class":263},[168,4695,345],{"class":263},[168,4697,4698,4701,4703,4706,4708,4710,4713,4715,4717,4719,4722,4724],{"class":170,"line":232},[168,4699,4700],{"class":319},"    getKey",[168,4702,334],{"class":263},[168,4704,4705],{"class":430}," args",[168,4707,437],{"class":423},[168,4709,440],{"class":263},[168,4711,4712],{"class":280},"page-",[168,4714,446],{"class":263},[168,4716,691],{"class":267},[168,4718,383],{"class":263},[168,4720,4721],{"class":267},"path",[168,4723,452],{"class":263},[168,4725,345],{"class":263},[168,4727,4728,4731,4733,4735,4737],{"class":170,"line":237},[168,4729,4730],{"class":330},"    swr",[168,4732,334],{"class":263},[168,4734,3073],{"class":3057},[168,4736,657],{"class":263},[168,4738,4739],{"class":521}," \u002F\u002F stale-while-revalidate\n",[168,4741,4742],{"class":170,"line":1198},[168,4743,413],{"class":263},[168,4745,4746,4748,4750,4752,4754,4757,4759,4761],{"class":170,"line":1203},[168,4747,418],{"class":319},[168,4749,334],{"class":263},[168,4751,424],{"class":423},[168,4753,427],{"class":263},[168,4755,4756],{"class":430}," path",[168,4758,434],{"class":263},[168,4760,437],{"class":423},[168,4762,371],{"class":263},[168,4764,4765],{"class":170,"line":1209},[168,4766,567],{"class":521},[168,4768,4769],{"class":170,"line":1249},[168,4770,413],{"class":263},[168,4772,4773,4775],{"class":170,"line":1254},[168,4774,459],{"class":263},[168,4776,462],{"class":267},[1434,4778,4779],{"id":4779},"缓存选项参考",[1439,4781,4782,4796],{},[1442,4783,4784],{},[1445,4785,4786,4789,4791,4794],{},[1448,4787,4788],{},"选项",[1448,4790,3158],{},[1448,4792,4793],{},"是否必需",[1448,4795,1455],{},[1457,4797,4798,4823,4841,4857,4873,4888],{},[1445,4799,4800,4805,4810,4813],{},[1462,4801,4802],{},[165,4803,4804],{},"maxAge",[1462,4806,4807],{},[165,4808,4809],{},"string | number",[1462,4811,4812],{},"是",[1462,4814,4815,4816,2067,4819,4822],{},"缓存时长（例如 ",[165,4817,4818],{},"'1h'",[165,4820,4821],{},"3600000","）",[1445,4824,4825,4830,4835,4838],{},[1462,4826,4827],{},[165,4828,4829],{},"getKey",[1462,4831,4832],{},[165,4833,4834],{},"(args) => string",[1462,4836,4837],{},"否",[1462,4839,4840],{},"自定义缓存键生成器",[1445,4842,4843,4848,4852,4854],{},[1462,4844,4845],{},[165,4846,4847],{},"staleMaxAge",[1462,4849,4850],{},[165,4851,1144],{},[1462,4853,4837],{},[1462,4855,4856],{},"stale-while-revalidate 的时长",[1445,4858,4859,4864,4868,4870],{},[1462,4860,4861],{},[165,4862,4863],{},"swr",[1462,4865,4866],{},[165,4867,2072],{},[1462,4869,4837],{},[1462,4871,4872],{},"启用 stale-while-revalidate",[1445,4874,4875,4879,4883,4885],{},[1462,4876,4877],{},[165,4878,471],{},[1462,4880,4881],{},[165,4882,386],{},[1462,4884,4837],{},[1462,4886,4887],{},"缓存名称（根据工具名称自动生成）",[1445,4889,4890,4895,4899,4901],{},[1462,4891,4892],{},[165,4893,4894],{},"group",[1462,4896,4897],{},[165,4898,386],{},[1462,4900,4837],{},[1462,4902,4903,4904,4822],{},"缓存组（默认：",[165,4905,4906],{},"'mcp'",[2897,4908,4909,4910,4915],{"color":2899,"icon":2900},"有关所有可用选项，请参阅 ",[2912,4911,4914],{"href":4912,"rel":4913},"https:\u002F\u002Fnitro.build\u002Fguide\u002Fcache#options",[4397],"Nitro 缓存文档","。",[145,4917,4918],{"id":4918},"高级示例",[1434,4920,4922],{"id":4921},"集成-api-的工具","集成 API 的工具",[150,4924,4925],{},"以下是一个典型的由 API 支持的工具示例：",[157,4927,4930],{"className":249,"code":4928,"filename":4929,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { createError } from 'h3'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'get-weather',\n  description: 'Get current weather for a city',\n  inputSchema: {\n    city: z.string().describe('City name'),\n  },\n  handler: async ({ city }) => {\n    const data = await $fetch(`\u002Fapi\u002Fweather\u002F${city}`)\n    if (!data) throw createError({ statusCode: 404, message: `City \"${city}\" not found` })\n    return data\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fget-weather.ts",[165,4931,4932,4950,4968,4986,4990,5002,5017,5032,5040,5072,5076,5095,5125,5177,5184,5188],{"__ignoreMap":163},[168,4933,4934,4936,4938,4940,4942,4944,4946,4948],{"class":170,"line":171},[168,4935,260],{"class":259},[168,4937,264],{"class":263},[168,4939,268],{"class":267},[168,4941,271],{"class":263},[168,4943,274],{"class":259},[168,4945,277],{"class":263},[168,4947,281],{"class":280},[168,4949,284],{"class":263},[168,4951,4952,4954,4956,4958,4960,4962,4964,4966],{"class":170,"line":177},[168,4953,260],{"class":259},[168,4955,264],{"class":263},[168,4957,3860],{"class":267},[168,4959,271],{"class":263},[168,4961,274],{"class":259},[168,4963,277],{"class":263},[168,4965,1434],{"class":280},[168,4967,284],{"class":263},[168,4969,4970,4972,4974,4976,4978,4980,4982,4984],{"class":170,"line":184},[168,4971,260],{"class":259},[168,4973,264],{"class":263},[168,4975,293],{"class":267},[168,4977,271],{"class":263},[168,4979,274],{"class":259},[168,4981,277],{"class":263},[168,4983,302],{"class":280},[168,4985,284],{"class":263},[168,4987,4988],{"class":170,"line":190},[168,4989,181],{"emptyLinePlaceholder":180},[168,4991,4992,4994,4996,4998,5000],{"class":170,"line":196},[168,4993,313],{"class":259},[168,4995,316],{"class":259},[168,4997,293],{"class":319},[168,4999,322],{"class":267},[168,5001,325],{"class":263},[168,5003,5004,5006,5008,5010,5013,5015],{"class":170,"line":202},[168,5005,331],{"class":330},[168,5007,334],{"class":263},[168,5009,277],{"class":263},[168,5011,5012],{"class":280},"get-weather",[168,5014,342],{"class":263},[168,5016,345],{"class":263},[168,5018,5019,5021,5023,5025,5028,5030],{"class":170,"line":208},[168,5020,350],{"class":330},[168,5022,334],{"class":263},[168,5024,277],{"class":263},[168,5026,5027],{"class":280},"Get current weather for a city",[168,5029,342],{"class":263},[168,5031,345],{"class":263},[168,5033,5034,5036,5038],{"class":170,"line":214},[168,5035,366],{"class":330},[168,5037,334],{"class":263},[168,5039,371],{"class":263},[168,5041,5042,5045,5047,5049,5051,5053,5055,5057,5059,5061,5063,5066,5068,5070],{"class":170,"line":220},[168,5043,5044],{"class":330},"    city",[168,5046,334],{"class":263},[168,5048,268],{"class":267},[168,5050,383],{"class":263},[168,5052,386],{"class":319},[168,5054,389],{"class":267},[168,5056,383],{"class":263},[168,5058,394],{"class":319},[168,5060,322],{"class":267},[168,5062,342],{"class":263},[168,5064,5065],{"class":280},"City name",[168,5067,342],{"class":263},[168,5069,406],{"class":267},[168,5071,345],{"class":263},[168,5073,5074],{"class":170,"line":226},[168,5075,413],{"class":263},[168,5077,5078,5080,5082,5084,5086,5089,5091,5093],{"class":170,"line":232},[168,5079,418],{"class":319},[168,5081,334],{"class":263},[168,5083,424],{"class":423},[168,5085,427],{"class":263},[168,5087,5088],{"class":430}," city",[168,5090,434],{"class":263},[168,5092,437],{"class":423},[168,5094,371],{"class":263},[168,5096,5097,5099,5101,5103,5105,5108,5110,5113,5116,5118,5121,5123],{"class":170,"line":237},[168,5098,1826],{"class":423},[168,5100,2636],{"class":267},[168,5102,1832],{"class":263},[168,5104,2199],{"class":259},[168,5106,5107],{"class":319}," $fetch",[168,5109,322],{"class":330},[168,5111,5112],{"class":263},"`",[168,5114,5115],{"class":280},"\u002Fapi\u002Fweather\u002F",[168,5117,446],{"class":263},[168,5119,5120],{"class":267},"city",[168,5122,452],{"class":263},[168,5124,462],{"class":330},[168,5126,5127,5129,5131,5133,5135,5137,5139,5141,5143,5145,5147,5149,5151,5153,5155,5157,5159,5162,5164,5166,5168,5171,5173,5175],{"class":170,"line":1198},[168,5128,1871],{"class":259},[168,5130,688],{"class":330},[168,5132,4009],{"class":263},[168,5134,2693],{"class":267},[168,5136,1886],{"class":330},[168,5138,4090],{"class":259},[168,5140,3860],{"class":319},[168,5142,322],{"class":330},[168,5144,854],{"class":263},[168,5146,4030],{"class":330},[168,5148,334],{"class":263},[168,5150,4035],{"class":1882},[168,5152,657],{"class":263},[168,5154,431],{"class":330},[168,5156,334],{"class":263},[168,5158,440],{"class":263},[168,5160,5161],{"class":280},"City \"",[168,5163,446],{"class":263},[168,5165,5120],{"class":267},[168,5167,459],{"class":263},[168,5169,5170],{"class":280},"\" not found",[168,5172,5112],{"class":263},[168,5174,271],{"class":263},[168,5176,462],{"class":330},[168,5178,5179,5181],{"class":170,"line":1203},[168,5180,702],{"class":259},[168,5182,5183],{"class":267}," data\n",[168,5185,5186],{"class":170,"line":1209},[168,5187,413],{"class":263},[168,5189,5190,5192],{"class":170,"line":1249},[168,5191,459],{"class":263},[168,5193,462],{"class":267},[145,5195,5196],{"id":5196},"分组与标签",[150,5198,1583,5199,472,5201,5204,5205,5208,5209,4915],{},[165,5200,4894],{},[165,5202,5203],{},"tags"," 来组织你的工具，以便进行过滤和渐进式发现。分组和标签会在 ",[165,5206,5207],{},"_meta"," 中公开，并在被采纳后映射到 ",[2912,5210,5213],{"href":5211,"rel":5212},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fmodelcontextprotocol\u002Fissues\u002F1300",[4397],"SEP-1300",[1434,5215,5216],{"id":5216},"显式分组与标签",[150,5218,5219,5220,472,5222,593],{},"直接在定义上设置 ",[165,5221,4894],{},[165,5223,5203],{},[157,5225,5227],{"className":249,"code":5226,"filename":2926,"language":252,"meta":163,"style":163},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  group: 'admin',\n  tags: ['destructive', 'user-management'],\n  description: 'Delete a user account',\n  inputSchema: {\n    userId: z.string(),\n  },\n  handler: async ({ userId }) => {\n    \u002F\u002F ...\n  },\n})\n",[165,5228,5229,5247,5265,5269,5281,5297,5326,5340,5348,5364,5368,5386,5390,5394],{"__ignoreMap":163},[168,5230,5231,5233,5235,5237,5239,5241,5243,5245],{"class":170,"line":171},[168,5232,260],{"class":259},[168,5234,264],{"class":263},[168,5236,268],{"class":267},[168,5238,271],{"class":263},[168,5240,274],{"class":259},[168,5242,277],{"class":263},[168,5244,281],{"class":280},[168,5246,284],{"class":263},[168,5248,5249,5251,5253,5255,5257,5259,5261,5263],{"class":170,"line":177},[168,5250,260],{"class":259},[168,5252,264],{"class":263},[168,5254,293],{"class":267},[168,5256,271],{"class":263},[168,5258,274],{"class":259},[168,5260,277],{"class":263},[168,5262,302],{"class":280},[168,5264,284],{"class":263},[168,5266,5267],{"class":170,"line":184},[168,5268,181],{"emptyLinePlaceholder":180},[168,5270,5271,5273,5275,5277,5279],{"class":170,"line":190},[168,5272,313],{"class":259},[168,5274,316],{"class":259},[168,5276,293],{"class":319},[168,5278,322],{"class":267},[168,5280,325],{"class":263},[168,5282,5283,5286,5288,5290,5293,5295],{"class":170,"line":196},[168,5284,5285],{"class":330},"  group",[168,5287,334],{"class":263},[168,5289,277],{"class":263},[168,5291,5292],{"class":280},"admin",[168,5294,342],{"class":263},[168,5296,345],{"class":263},[168,5298,5299,5302,5304,5306,5308,5311,5313,5315,5317,5320,5322,5324],{"class":170,"line":202},[168,5300,5301],{"class":330},"  tags",[168,5303,334],{"class":263},[168,5305,851],{"class":267},[168,5307,342],{"class":263},[168,5309,5310],{"class":280},"destructive",[168,5312,342],{"class":263},[168,5314,657],{"class":263},[168,5316,277],{"class":263},[168,5318,5319],{"class":280},"user-management",[168,5321,342],{"class":263},[168,5323,861],{"class":267},[168,5325,345],{"class":263},[168,5327,5328,5330,5332,5334,5336,5338],{"class":170,"line":208},[168,5329,350],{"class":330},[168,5331,334],{"class":263},[168,5333,277],{"class":263},[168,5335,3006],{"class":280},[168,5337,342],{"class":263},[168,5339,345],{"class":263},[168,5341,5342,5344,5346],{"class":170,"line":214},[168,5343,366],{"class":330},[168,5345,334],{"class":263},[168,5347,371],{"class":263},[168,5349,5350,5352,5354,5356,5358,5360,5362],{"class":170,"line":220},[168,5351,3023],{"class":330},[168,5353,334],{"class":263},[168,5355,268],{"class":267},[168,5357,383],{"class":263},[168,5359,386],{"class":319},[168,5361,389],{"class":267},[168,5363,345],{"class":263},[168,5365,5366],{"class":170,"line":226},[168,5367,413],{"class":263},[168,5369,5370,5372,5374,5376,5378,5380,5382,5384],{"class":170,"line":232},[168,5371,418],{"class":319},[168,5373,334],{"class":263},[168,5375,424],{"class":423},[168,5377,427],{"class":263},[168,5379,3123],{"class":430},[168,5381,434],{"class":263},[168,5383,437],{"class":423},[168,5385,371],{"class":263},[168,5387,5388],{"class":170,"line":237},[168,5389,567],{"class":521},[168,5391,5392],{"class":170,"line":1198},[168,5393,413],{"class":263},[168,5395,5396,5398],{"class":170,"line":1203},[168,5397,459],{"class":263},[168,5399,462],{"class":267},[1434,5401,5402],{"id":5402},"从目录自动推断分组",[150,5404,5405],{},"将工具放在子目录中，分组将被自动推断：",[157,5407,5411],{"className":5408,"code":5410,"language":2862},[5409],"language-text","server\u002Fmcp\u002Ftools\u002F\n├── admin\u002F\n│   ├── delete-user.ts    → group: 'admin'\n│   └── stats.ts          → group: 'admin'\n├── content\u002F\n│   └── list-pages.ts     → group: 'content'\n└── search.ts             → no group\n",[165,5412,5410],{"__ignoreMap":163},[150,5414,5415,5416,5418],{},"定义上显式设置的 ",[165,5417,4894],{}," 始终优先于目录推断的值。",[1434,5420,5421],{"id":5421},"客户端如何查看分组与标签",[150,5423,5424,5425,5428,5429,5431],{},"分组和标签会包含在 ",[165,5426,5427],{},"tools\u002Flist"," 响应的 ",[165,5430,5207],{}," 字段中：",[157,5433,5437],{"className":5434,"code":5435,"language":5436,"meta":163,"style":163},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"delete-user\",\n  \"_meta\": {\n    \"group\": \"admin\",\n    \"tags\": [\"destructive\", \"user-management\"]\n  }\n}\n","json",[165,5438,5439,5443,5464,5476,5495,5524,5529],{"__ignoreMap":163},[168,5440,5441],{"class":170,"line":171},[168,5442,325],{"class":263},[168,5444,5445,5448,5450,5453,5455,5458,5460,5462],{"class":170,"line":177},[168,5446,5447],{"class":263},"  \"",[168,5449,471],{"class":423},[168,5451,5452],{"class":263},"\"",[168,5454,334],{"class":263},[168,5456,5457],{"class":263}," \"",[168,5459,2991],{"class":280},[168,5461,5452],{"class":263},[168,5463,345],{"class":263},[168,5465,5466,5468,5470,5472,5474],{"class":170,"line":184},[168,5467,5447],{"class":263},[168,5469,5207],{"class":423},[168,5471,5452],{"class":263},[168,5473,334],{"class":263},[168,5475,371],{"class":263},[168,5477,5478,5481,5483,5485,5487,5489,5491,5493],{"class":170,"line":190},[168,5479,5480],{"class":263},"    \"",[168,5482,4894],{"class":2090},[168,5484,5452],{"class":263},[168,5486,334],{"class":263},[168,5488,5457],{"class":263},[168,5490,5292],{"class":280},[168,5492,5452],{"class":263},[168,5494,345],{"class":263},[168,5496,5497,5499,5501,5503,5505,5507,5509,5511,5513,5515,5517,5519,5521],{"class":170,"line":196},[168,5498,5480],{"class":263},[168,5500,5203],{"class":2090},[168,5502,5452],{"class":263},[168,5504,334],{"class":263},[168,5506,851],{"class":263},[168,5508,5452],{"class":263},[168,5510,5310],{"class":280},[168,5512,5452],{"class":263},[168,5514,657],{"class":263},[168,5516,5457],{"class":263},[168,5518,5319],{"class":280},[168,5520,5452],{"class":263},[168,5522,5523],{"class":263},"]\n",[168,5525,5526],{"class":170,"line":202},[168,5527,5528],{"class":263},"  }\n",[168,5530,5531],{"class":170,"line":208},[168,5532,2222],{"class":263},[150,5534,5535],{},"MCP 客户端可以在其 UI 中使用这些值来过滤、排序或分组工具。",[2897,5537,5538,5539,472,5542,5545,5546,472,5548,5550,5551,2067,5554,5557,5558,5561],{"color":2899,"icon":2900},"对于 ",[3518,5540,5541],{},"资源（resources）",[3518,5543,5544],{},"提示词（prompts）","，",[165,5547,4894],{},[165,5549,5203],{}," 会存储在定义对象上，但尚未在协议响应（",[165,5552,5553],{},"resources\u002Flist",[165,5555,5556],{},"prompts\u002Flist","）中公开。当 MCP SDK 采纳 ",[2912,5559,5213],{"href":5211,"rel":5560},[4397]," 后，将支持此功能。",[145,5563,5564],{"id":5564},"文件组织",[150,5566,5567,5568,5571],{},"将你的工具组织在 ",[165,5569,5570],{},"server\u002Fmcp\u002Ftools\u002F"," 目录中。支持扁平和嵌套布局：",[157,5573,5576],{"className":5574,"code":5575,"language":2862},[5409],"server\u002F\n└── mcp\u002F\n    └── tools\u002F\n        ├── echo.ts\n        ├── calculator.ts\n        ├── admin\u002F\n        │   ├── delete-user.ts\n        │   └── stats.ts\n        └── content\u002F\n            └── list-pages.ts\n",[165,5577,5575],{"__ignoreMap":163},[150,5579,5580,5581,4915],{},"每个文件都应导出一个默认的工具定义。子目录会自动为其中的所有工具设置 ",[165,5582,4894],{},[145,5584,5585],{"id":5585},"类型安全",[150,5587,5588],{},"该模块提供完整的 TypeScript 类型推断：",[157,5590,5592],{"className":249,"code":5591,"language":252,"meta":163,"style":163},"\u002F\u002F 输入类型从 inputSchema 推断\nhandler: async ({ message }) => {\n  \u002F\u002F message 的类型为 string\n}\n\n\u002F\u002F 输出类型从 outputSchema 推断\nconst result = {\n  structuredContent: {\n    bmi: 25.5,      \u002F\u002F number\n    category: '...', \u002F\u002F string\n  },\n}\n",[165,5593,5594,5599,5617,5622,5626,5630,5635,5648,5656,5669,5687,5691],{"__ignoreMap":163},[168,5595,5596],{"class":170,"line":171},[168,5597,5598],{"class":521},"\u002F\u002F 输入类型从 inputSchema 推断\n",[168,5600,5601,5603,5605,5607,5609,5611,5613,5615],{"class":170,"line":177},[168,5602,2091],{"class":2090},[168,5604,334],{"class":263},[168,5606,424],{"class":423},[168,5608,427],{"class":263},[168,5610,431],{"class":430},[168,5612,434],{"class":263},[168,5614,437],{"class":423},[168,5616,371],{"class":263},[168,5618,5619],{"class":170,"line":184},[168,5620,5621],{"class":521},"  \u002F\u002F message 的类型为 string\n",[168,5623,5624],{"class":170,"line":190},[168,5625,2222],{"class":263},[168,5627,5628],{"class":170,"line":196},[168,5629,181],{"emptyLinePlaceholder":180},[168,5631,5632],{"class":170,"line":202},[168,5633,5634],{"class":521},"\u002F\u002F 输出类型从 outputSchema 推断\n",[168,5636,5637,5640,5643,5646],{"class":170,"line":208},[168,5638,5639],{"class":423},"const",[168,5641,5642],{"class":267}," result ",[168,5644,5645],{"class":263},"=",[168,5647,371],{"class":263},[168,5649,5650,5652,5654],{"class":170,"line":214},[168,5651,2377],{"class":330},[168,5653,334],{"class":263},[168,5655,371],{"class":263},[168,5657,5658,5660,5662,5664,5666],{"class":170,"line":220},[168,5659,1764],{"class":330},[168,5661,334],{"class":263},[168,5663,2390],{"class":1882},[168,5665,657],{"class":263},[168,5667,5668],{"class":521},"      \u002F\u002F number\n",[168,5670,5671,5673,5675,5677,5680,5682,5684],{"class":170,"line":226},[168,5672,1781],{"class":330},[168,5674,334],{"class":263},[168,5676,277],{"class":263},[168,5678,5679],{"class":280},"...",[168,5681,342],{"class":263},[168,5683,657],{"class":263},[168,5685,5686],{"class":521}," \u002F\u002F string\n",[168,5688,5689],{"class":170,"line":232},[168,5690,413],{"class":263},[168,5692,5693],{"class":170,"line":237},[168,5694,2222],{"class":263},[145,5696,5697],{"id":5697},"条件注册",[150,5699,3527,5700,5703],{},[165,5701,5702],{},"enabled"," 守卫来控制工具是否对客户端可见：",[157,5705,5708],{"className":249,"code":5706,"filename":5707,"language":252,"meta":163,"style":163},"import { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'admin-tool',\n  description: 'Admin-only tool',\n  enabled: event => event.context.user?.role === 'admin',\n  handler: async () => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fadmin-tool.ts",[165,5709,5710,5728,5732,5744,5759,5774,5814,5828,5832,5836],{"__ignoreMap":163},[168,5711,5712,5714,5716,5718,5720,5722,5724,5726],{"class":170,"line":171},[168,5713,260],{"class":259},[168,5715,264],{"class":263},[168,5717,293],{"class":267},[168,5719,271],{"class":263},[168,5721,274],{"class":259},[168,5723,277],{"class":263},[168,5725,302],{"class":280},[168,5727,284],{"class":263},[168,5729,5730],{"class":170,"line":177},[168,5731,181],{"emptyLinePlaceholder":180},[168,5733,5734,5736,5738,5740,5742],{"class":170,"line":184},[168,5735,313],{"class":259},[168,5737,316],{"class":259},[168,5739,293],{"class":319},[168,5741,322],{"class":267},[168,5743,325],{"class":263},[168,5745,5746,5748,5750,5752,5755,5757],{"class":170,"line":190},[168,5747,331],{"class":330},[168,5749,334],{"class":263},[168,5751,277],{"class":263},[168,5753,5754],{"class":280},"admin-tool",[168,5756,342],{"class":263},[168,5758,345],{"class":263},[168,5760,5761,5763,5765,5767,5770,5772],{"class":170,"line":196},[168,5762,350],{"class":330},[168,5764,334],{"class":263},[168,5766,277],{"class":263},[168,5768,5769],{"class":280},"Admin-only tool",[168,5771,342],{"class":263},[168,5773,345],{"class":263},[168,5775,5776,5779,5781,5784,5786,5788,5790,5793,5795,5797,5800,5803,5806,5808,5810,5812],{"class":170,"line":202},[168,5777,5778],{"class":319},"  enabled",[168,5780,334],{"class":263},[168,5782,5783],{"class":430}," event",[168,5785,437],{"class":423},[168,5787,5783],{"class":267},[168,5789,383],{"class":263},[168,5791,5792],{"class":267},"context",[168,5794,383],{"class":263},[168,5796,4012],{"class":267},[168,5798,5799],{"class":263},"?.",[168,5801,5802],{"class":267},"role ",[168,5804,5805],{"class":263},"===",[168,5807,277],{"class":263},[168,5809,5292],{"class":280},[168,5811,342],{"class":263},[168,5813,345],{"class":263},[168,5815,5816,5818,5820,5822,5824,5826],{"class":170,"line":208},[168,5817,418],{"class":319},[168,5819,334],{"class":263},[168,5821,424],{"class":423},[168,5823,558],{"class":263},[168,5825,437],{"class":423},[168,5827,371],{"class":263},[168,5829,5830],{"class":170,"line":214},[168,5831,567],{"class":521},[168,5833,5834],{"class":170,"line":220},[168,5835,413],{"class":263},[168,5837,5838,5840],{"class":170,"line":226},[168,5839,459],{"class":263},[168,5841,462],{"class":267},[150,5843,5844,5845,5847,5848,5850,5851,5853],{},"当 ",[165,5846,5702],{}," 返回 ",[165,5849,3181],{}," 时，该工具将从 ",[165,5852,5427],{}," 中隐藏且无法被调用。",[2897,5855,5857,5858,5860],{"color":5856,"icon":13},"primary","有关基于身份验证过滤的详细文档，请参阅 ",[2912,5859,101],{"href":102}," 指南。",[145,5862,5863],{"id":5863},"后续步骤",[586,5865,5866,5871,5877,5883,5889,5894],{},[589,5867,5868,5870],{},[2912,5869,51],{"href":52}," - 创建资源以暴露数据",[589,5872,5873,5876],{},[2912,5874,5875],{"href":57},"提示词"," - 创建可复用的提示词",[589,5878,5879,5882],{},[2912,5880,5881],{"href":62},"处理程序"," - 创建自定义 MCP 端点",[589,5884,5885,5888],{},[2912,5886,5887],{"href":107},"代码模式"," - 让 LLM 使用 JavaScript 编排工具",[589,5890,5891,5893],{},[2912,5892,101],{"href":102}," - 有条件地注册定义",[589,5895,5896,5898],{},[2912,5897,111],{"href":127}," - 查看更多工具示例",[5900,5901,5902],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":163,"searchDepth":177,"depth":177,"links":5904},[5905,5906,5907,5908,5909,5912,5913,5918,5921,5922,5926,5931,5934,5939,5940,5941,5942],{"id":147,"depth":177,"text":148},{"id":243,"depth":177,"text":243},{"id":465,"depth":177,"text":465},{"id":617,"depth":177,"text":617},{"id":898,"depth":177,"text":898,"children":5910},[5911],{"id":1436,"depth":184,"text":1437},{"id":1580,"depth":177,"text":1580},{"id":2051,"depth":177,"text":2051,"children":5914},[5915,5916,5917],{"id":2061,"depth":184,"text":2061},{"id":2272,"depth":184,"text":2272},{"id":2533,"depth":184,"text":2533},{"id":2919,"depth":177,"text":2919,"children":5919},[5920],{"id":3146,"depth":184,"text":3146},{"id":3524,"depth":177,"text":3524},{"id":2915,"depth":177,"text":2915,"children":5923},[5924,5925],{"id":3819,"depth":184,"text":3820},{"id":4174,"depth":184,"text":4174},{"id":4379,"depth":177,"text":4379,"children":5927},[5928,5929,5930],{"id":4389,"depth":184,"text":4389},{"id":4567,"depth":184,"text":4567},{"id":4779,"depth":184,"text":4779},{"id":4918,"depth":177,"text":4918,"children":5932},[5933],{"id":4921,"depth":184,"text":4922},{"id":5196,"depth":177,"text":5196,"children":5935},[5936,5937,5938],{"id":5216,"depth":184,"text":5216},{"id":5402,"depth":184,"text":5402},{"id":5421,"depth":184,"text":5421},{"id":5564,"depth":177,"text":5564},{"id":5585,"depth":177,"text":5585},{"id":5697,"depth":177,"text":5697},{"id":5863,"depth":177,"text":5863},"使用 Zod 验证和类型安全创建 MCP 工具。","md",null,{},{"icon":49},{"title":46,"description":5949},"使用 Zod 验证和完整的 TypeScript 支持创建 MCP 工具。","wECqxB6HKBw_-6aXMfr6ZflrXVB3JOt5mTvkjD9Z-5M",[5952,5954],{"title":35,"path":36,"stem":37,"description":5953,"icon":38,"children":-1},"使用 Agent Skills 进行 AI 辅助的 MCP 服务器开发。让 AI 帮助你在 Nuxt 应用中设置、创建、审查和排查 MCP 服务器。",{"title":51,"path":52,"stem":53,"description":5955,"icon":54,"children":-1},"将只读数据源公开为 MCP 资源，以便为 AI 模型提供上下文。",1775615721143]