[{"data":1,"prerenderedAt":1427},["ShallowReactive",2],{"navigation_docs":3,"-tools-groups-organization":282,"-tools-groups-organization-surround":1422},[4,40,70,99,122,156,189,253],{"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},"Inspector","\u002Fgetting-started\u002Finspector","1.getting-started\u002F4.inspector","i-lucide-circuit-board",{"title":30,"path":31,"stem":32,"icon":33},"Connection","\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},"工具","\u002Ftools","2.tools",[45,50,55,60,65],{"title":46,"path":47,"stem":48,"icon":49},"概览","\u002Ftools\u002Foverview","2.tools\u002F0.overview","i-lucide-wrench",{"title":51,"path":52,"stem":53,"icon":54},"Schema, handler & returns","\u002Ftools\u002Fschema-handler","2.tools\u002F1.schema-handler","i-lucide-braces",{"title":56,"path":57,"stem":58,"icon":59},"注释与输入示例","\u002Ftools\u002Fannotations","2.tools\u002F2.annotations","i-lucide-badge-info",{"title":61,"path":62,"stem":63,"icon":64},"错误与缓存","\u002Ftools\u002Ferrors-caching","2.tools\u002F3.errors-caching","i-lucide-shield",{"title":66,"path":67,"stem":68,"icon":69},"分组、文件与动态注册","\u002Ftools\u002Fgroups-organization","2.tools\u002F4.groups-organization","i-lucide-tags",{"title":71,"path":72,"stem":73,"children":74,"page":39},"资源","\u002Fresources","3.resources",[75,79,84,89,94],{"title":46,"path":76,"stem":77,"icon":78},"\u002Fresources\u002Foverview","3.resources\u002F0.overview","i-lucide-package",{"title":80,"path":81,"stem":82,"icon":83},"静态资源与结构","\u002Fresources\u002Fstatic-and-structure","3.resources\u002F1.static-and-structure","i-lucide-file-stack",{"title":85,"path":86,"stem":87,"icon":88},"模板与处理程序","\u002Fresources\u002Ftemplates-and-handlers","3.resources\u002F2.templates-and-handlers","i-lucide-git-branch",{"title":90,"path":91,"stem":92,"icon":93},"元数据、内容与错误","\u002Fresources\u002Fcontent-metadata-errors","3.resources\u002F3.content-metadata-errors","i-lucide-layers",{"title":95,"path":96,"stem":97,"icon":98},"分组与组织","\u002Fresources\u002Forganization","3.resources\u002F4.organization","i-lucide-folder-tree",{"title":100,"path":101,"stem":102,"children":103,"page":39},"提示词","\u002Fprompts","4.prompts",[104,108,113,117],{"title":46,"path":105,"stem":106,"icon":107},"\u002Fprompts\u002Foverview","4.prompts\u002F0.overview","i-lucide-message-square",{"title":109,"path":110,"stem":111,"icon":112},"编写与结构","\u002Fprompts\u002Fauthoring","4.prompts\u002F1.authoring","i-lucide-pen-line",{"title":114,"path":115,"stem":116,"icon":93},"输入、处理器与消息","\u002Fprompts\u002Finput-handler-messages","4.prompts\u002F2.input-handler-messages",{"title":118,"path":119,"stem":120,"icon":121},"模式与高级用法","\u002Fprompts\u002Fpatterns-advanced","4.prompts\u002F3.patterns-advanced","i-lucide-line-chart",{"title":123,"path":124,"stem":125,"children":126,"page":39},"处理器","\u002Fhandlers","5.handlers",[127,131,136,141,146,151],{"title":46,"path":128,"stem":129,"icon":130},"\u002Fhandlers\u002Foverview","5.handlers\u002F0.overview","i-lucide-server",{"title":132,"path":133,"stem":134,"icon":135},"默认与自定义处理器","\u002Fhandlers\u002Fdefault-and-custom","5.handlers\u002F1.default-and-custom","i-lucide-toggle-left",{"title":137,"path":138,"stem":139,"icon":140},"结构与选项","\u002Fhandlers\u002Fstructure-and-options","5.handlers\u002F2.structure-and-options","i-lucide-sliders-horizontal",{"title":142,"path":143,"stem":144,"icon":145},"示例与路由","\u002Fhandlers\u002Fexamples-routing","5.handlers\u002F3.examples-routing","i-lucide-route",{"title":147,"path":148,"stem":149,"icon":150},"分享与实践","\u002Fhandlers\u002Fsharing-practices","5.handlers\u002F4.sharing-practices","i-lucide-share-2",{"title":152,"path":153,"stem":154,"icon":155},"多处理器组织","\u002Fhandlers\u002Forganization","5.handlers\u002F5.organization","i-lucide-network",{"title":157,"path":158,"stem":159,"children":160,"page":39},"应用","\u002Fapps","6.apps",[161,165,170,175,179,184],{"title":46,"path":162,"stem":163,"icon":164},"\u002Fapps\u002Foverview","6.apps\u002F0.overview","i-lucide-app-window",{"title":166,"path":167,"stem":168,"icon":169},"编写与 defineMcpApp","\u002Fapps\u002Fauthoring","6.apps\u002F1.authoring","i-lucide-code-2",{"title":171,"path":172,"stem":173,"icon":174},"useMcpApp() 桥接","\u002Fapps\u002Fuse-mcp-app","6.apps\u002F2.use-mcp-app","i-lucide-message-circle",{"title":176,"path":177,"stem":178,"icon":64},"CSP 与构建流水线","\u002Fapps\u002Fcsp-and-wiring","6.apps\u002F3.csp-and-wiring",{"title":180,"path":181,"stem":182,"icon":183},"测试与发布","\u002Fapps\u002Ftesting-publishing","6.apps\u002F4.testing-publishing","i-lucide-rocket",{"title":185,"path":186,"stem":187,"icon":188},"模式与限制","\u002Fapps\u002Fpatterns-reference","6.apps\u002F5.patterns-reference","i-lucide-book-marked",{"title":190,"path":191,"stem":192,"children":193,"page":39},"进阶主题","\u002Fadvanced","7.advanced",[194,199,204,209,214,218,223,228,233,238,243,248],{"title":195,"path":196,"stem":197,"icon":198},"自定义路径","\u002Fadvanced\u002Fcustom-paths","7.advanced\u002F1.custom-paths","i-lucide-folder",{"title":200,"path":201,"stem":202,"icon":203},"日志","\u002Fadvanced\u002Flogging","7.advanced\u002F10.logging","i-lucide-scroll-text",{"title":205,"path":206,"stem":207,"icon":208},"MCP Apps 内部机制","\u002Fadvanced\u002Fmcp-apps-internals","7.advanced\u002F11.mcp-apps-internals","i-lucide-cog",{"title":210,"path":211,"stem":212,"icon":213},"列出定义","\u002Fadvanced\u002Flisting-definitions","7.advanced\u002F12.listing-definitions","i-lucide-list",{"title":215,"path":216,"stem":217,"icon":64},"Middleware","\u002Fadvanced\u002Fmiddleware","7.advanced\u002F2.middleware",{"title":219,"path":220,"stem":221,"icon":222},"TypeScript","\u002Fadvanced\u002Ftypescript","7.advanced\u002F3.typescript","i-lucide-type",{"title":224,"path":225,"stem":226,"icon":227},"Hooks","\u002Fadvanced\u002Fhooks","7.advanced\u002F4.hooks","i-lucide-webhook",{"title":229,"path":230,"stem":231,"icon":232},"MCP 评估","\u002Fadvanced\u002Fevals","7.advanced\u002F5.evals","i-lucide-flask-conical",{"title":234,"path":235,"stem":236,"icon":237},"会话","\u002Fadvanced\u002Fsessions","7.advanced\u002F6.sessions","i-lucide-database",{"title":239,"path":240,"stem":241,"icon":242},"动态定义","\u002Fadvanced\u002Fdynamic-definitions","7.advanced\u002F7.dynamic-definitions","i-lucide-toggle-right",{"title":244,"path":245,"stem":246,"icon":247},"代码模式 (Code Mode)","\u002Fadvanced\u002Fcode-mode","7.advanced\u002F8.code-mode","i-lucide-code",{"title":249,"path":250,"stem":251,"icon":252},"启发式询问","\u002Fadvanced\u002Felicitation","7.advanced\u002F9.elicitation","i-lucide-message-square-quote",{"title":254,"path":255,"stem":256,"children":257,"page":39},"示例","\u002Fexamples","8.examples",[258,263,268,273,278],{"title":259,"path":260,"stem":261,"icon":262},"身份验证","\u002Fexamples\u002Fauthentication","8.examples\u002F1.authentication","i-lucide-shield-check",{"title":264,"path":265,"stem":266,"icon":267},"API 集成","\u002Fexamples\u002Fapi-integration","8.examples\u002F2.api-integration","i-lucide-globe",{"title":269,"path":270,"stem":271,"icon":272},"常见模式","\u002Fexamples\u002Fcommon-patterns","8.examples\u002F3.common-patterns","i-lucide-lightbulb",{"title":274,"path":275,"stem":276,"icon":277},"文件操作","\u002Fexamples\u002Ffile-operations","8.examples\u002F4.file-operations","i-lucide-file",{"title":279,"path":280,"stem":281,"icon":107},"提示词示例","\u002Fexamples\u002Fprompt-examples","8.examples\u002F5.prompt-examples",{"id":283,"title":66,"body":284,"description":1413,"extension":1414,"links":1415,"meta":1416,"navigation":1417,"path":67,"seo":1418,"stem":68,"__hash__":1421},"docs\u002F2.tools\u002F4.groups-organization.md",{"type":285,"value":286,"toc":1399},"minimark",[287,291,296,300,656,659,682,685,693,877,880,883,891,897,900,910,1014,1017,1048,1051,1058,1064,1070,1073,1076,1187,1190,1197,1337,1350,1357,1360,1395],[288,289,290],"h2",{"id":290},"高级示例",[292,293,295],"h3",{"id":294},"带-api-集成的工具","带 API 集成的工具",[297,298,299],"p",{},"下面是一个展示典型 API 驱动工具的示例：",[301,302,308],"pre",{"className":303,"code":304,"filename":305,"language":306,"meta":307,"style":307},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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: '获取某个城市的当前天气',\n  inputSchema: {\n    city: z.string().describe('城市名称'),\n  },\n  handler: async ({ city }) => {\n    const data = await $fetch(`\u002Fapi\u002Fweather\u002F${city}`)\n    if (!data) throw createError({ statusCode: 404, message: `未找到城市 \"${city}\"` })\n    return data\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fget-weather.ts","typescript","",[309,310,311,344,364,385,392,410,431,448,459,497,503,530,568,635,644,649],"code",{"__ignoreMap":307},[312,313,316,320,324,328,331,334,337,341],"span",{"class":314,"line":315},"line",1,[312,317,319],{"class":318},"s7zQu","import",[312,321,323],{"class":322},"sMK4o"," {",[312,325,327],{"class":326},"sTEyZ"," z",[312,329,330],{"class":322}," }",[312,332,333],{"class":318}," from",[312,335,336],{"class":322}," '",[312,338,340],{"class":339},"sfazB","zod",[312,342,343],{"class":322},"'\n",[312,345,347,349,351,354,356,358,360,362],{"class":314,"line":346},2,[312,348,319],{"class":318},[312,350,323],{"class":322},[312,352,353],{"class":326}," createError",[312,355,330],{"class":322},[312,357,333],{"class":318},[312,359,336],{"class":322},[312,361,292],{"class":339},[312,363,343],{"class":322},[312,365,367,369,371,374,376,378,380,383],{"class":314,"line":366},3,[312,368,319],{"class":318},[312,370,323],{"class":322},[312,372,373],{"class":326}," defineMcpTool",[312,375,330],{"class":322},[312,377,333],{"class":318},[312,379,336],{"class":322},[312,381,382],{"class":339},"@nuxtjs\u002Fmcp-toolkit\u002Fserver",[312,384,343],{"class":322},[312,386,388],{"class":314,"line":387},4,[312,389,391],{"emptyLinePlaceholder":390},true,"\n",[312,393,395,398,401,404,407],{"class":314,"line":394},5,[312,396,397],{"class":318},"export",[312,399,400],{"class":318}," default",[312,402,373],{"class":403},"s2Zo4",[312,405,406],{"class":326},"(",[312,408,409],{"class":322},"{\n",[312,411,413,417,420,422,425,428],{"class":314,"line":412},6,[312,414,416],{"class":415},"swJcz","  name",[312,418,419],{"class":322},":",[312,421,336],{"class":322},[312,423,424],{"class":339},"get-weather",[312,426,427],{"class":322},"'",[312,429,430],{"class":322},",\n",[312,432,434,437,439,441,444,446],{"class":314,"line":433},7,[312,435,436],{"class":415},"  description",[312,438,419],{"class":322},[312,440,336],{"class":322},[312,442,443],{"class":339},"获取某个城市的当前天气",[312,445,427],{"class":322},[312,447,430],{"class":322},[312,449,451,454,456],{"class":314,"line":450},8,[312,452,453],{"class":415},"  inputSchema",[312,455,419],{"class":322},[312,457,458],{"class":322}," {\n",[312,460,462,465,467,469,472,475,478,480,483,485,487,490,492,495],{"class":314,"line":461},9,[312,463,464],{"class":415},"    city",[312,466,419],{"class":322},[312,468,327],{"class":326},[312,470,471],{"class":322},".",[312,473,474],{"class":403},"string",[312,476,477],{"class":326},"()",[312,479,471],{"class":322},[312,481,482],{"class":403},"describe",[312,484,406],{"class":326},[312,486,427],{"class":322},[312,488,489],{"class":339},"城市名称",[312,491,427],{"class":322},[312,493,494],{"class":326},")",[312,496,430],{"class":322},[312,498,500],{"class":314,"line":499},10,[312,501,502],{"class":322},"  },\n",[312,504,506,509,511,515,518,522,525,528],{"class":314,"line":505},11,[312,507,508],{"class":403},"  handler",[312,510,419],{"class":322},[312,512,514],{"class":513},"spNyl"," async",[312,516,517],{"class":322}," ({",[312,519,521],{"class":520},"sHdIc"," city",[312,523,524],{"class":322}," })",[312,526,527],{"class":513}," =>",[312,529,458],{"class":322},[312,531,533,536,539,542,545,548,550,553,556,559,562,565],{"class":314,"line":532},12,[312,534,535],{"class":513},"    const",[312,537,538],{"class":326}," data",[312,540,541],{"class":322}," =",[312,543,544],{"class":318}," await",[312,546,547],{"class":403}," $fetch",[312,549,406],{"class":415},[312,551,552],{"class":322},"`",[312,554,555],{"class":339},"\u002Fapi\u002Fweather\u002F",[312,557,558],{"class":322},"${",[312,560,561],{"class":326},"city",[312,563,564],{"class":322},"}`",[312,566,567],{"class":415},")\n",[312,569,571,574,577,580,583,586,589,591,593,596,599,601,605,608,611,613,616,619,621,623,626,629,631,633],{"class":314,"line":570},13,[312,572,573],{"class":318},"    if",[312,575,576],{"class":415}," (",[312,578,579],{"class":322},"!",[312,581,582],{"class":326},"data",[312,584,585],{"class":415},") ",[312,587,588],{"class":318},"throw",[312,590,353],{"class":403},[312,592,406],{"class":415},[312,594,595],{"class":322},"{",[312,597,598],{"class":415}," statusCode",[312,600,419],{"class":322},[312,602,604],{"class":603},"sbssI"," 404",[312,606,607],{"class":322},",",[312,609,610],{"class":415}," message",[312,612,419],{"class":322},[312,614,615],{"class":322}," `",[312,617,618],{"class":339},"未找到城市 \"",[312,620,558],{"class":322},[312,622,561],{"class":326},[312,624,625],{"class":322},"}",[312,627,628],{"class":339},"\"",[312,630,552],{"class":322},[312,632,330],{"class":322},[312,634,567],{"class":415},[312,636,638,641],{"class":314,"line":637},14,[312,639,640],{"class":318},"    return",[312,642,643],{"class":326}," data\n",[312,645,647],{"class":314,"line":646},15,[312,648,502],{"class":322},[312,650,652,654],{"class":314,"line":651},16,[312,653,625],{"class":322},[312,655,567],{"class":326},[288,657,658],{"id":658},"分组和标签",[297,660,661,662,665,666,669,670,673,674,681],{},"使用 ",[309,663,664],{},"group"," 和 ",[309,667,668],{},"tags"," 来组织你的工具，以便进行筛选和渐进式发现。分组和标签会暴露在 ",[309,671,672],{},"_meta"," 中，并在采用 ",[675,676,680],"a",{"href":677,"rel":678},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fmodelcontextprotocol\u002Fissues\u002F1300",[679],"nofollow","SEP-1300"," 后映射到它。",[292,683,684],{"id":684},"显式分组和标签",[297,686,687,688,665,690,692],{},"直接在定义上设置 ",[309,689,664],{},[309,691,668],{},"：",[301,694,697],{"className":303,"code":695,"filename":696,"language":306,"meta":307,"style":307},"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: '删除用户账户',\n  inputSchema: {\n    userId: z.string(),\n  },\n  handler: async ({ userId }) => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fdelete-user.ts",[309,698,699,717,735,739,751,767,798,813,821,838,842,861,867,871],{"__ignoreMap":307},[312,700,701,703,705,707,709,711,713,715],{"class":314,"line":315},[312,702,319],{"class":318},[312,704,323],{"class":322},[312,706,327],{"class":326},[312,708,330],{"class":322},[312,710,333],{"class":318},[312,712,336],{"class":322},[312,714,340],{"class":339},[312,716,343],{"class":322},[312,718,719,721,723,725,727,729,731,733],{"class":314,"line":346},[312,720,319],{"class":318},[312,722,323],{"class":322},[312,724,373],{"class":326},[312,726,330],{"class":322},[312,728,333],{"class":318},[312,730,336],{"class":322},[312,732,382],{"class":339},[312,734,343],{"class":322},[312,736,737],{"class":314,"line":366},[312,738,391],{"emptyLinePlaceholder":390},[312,740,741,743,745,747,749],{"class":314,"line":387},[312,742,397],{"class":318},[312,744,400],{"class":318},[312,746,373],{"class":403},[312,748,406],{"class":326},[312,750,409],{"class":322},[312,752,753,756,758,760,763,765],{"class":314,"line":394},[312,754,755],{"class":415},"  group",[312,757,419],{"class":322},[312,759,336],{"class":322},[312,761,762],{"class":339},"admin",[312,764,427],{"class":322},[312,766,430],{"class":322},[312,768,769,772,774,777,779,782,784,786,788,791,793,796],{"class":314,"line":412},[312,770,771],{"class":415},"  tags",[312,773,419],{"class":322},[312,775,776],{"class":326}," [",[312,778,427],{"class":322},[312,780,781],{"class":339},"destructive",[312,783,427],{"class":322},[312,785,607],{"class":322},[312,787,336],{"class":322},[312,789,790],{"class":339},"user-management",[312,792,427],{"class":322},[312,794,795],{"class":326},"]",[312,797,430],{"class":322},[312,799,800,802,804,806,809,811],{"class":314,"line":433},[312,801,436],{"class":415},[312,803,419],{"class":322},[312,805,336],{"class":322},[312,807,808],{"class":339},"删除用户账户",[312,810,427],{"class":322},[312,812,430],{"class":322},[312,814,815,817,819],{"class":314,"line":450},[312,816,453],{"class":415},[312,818,419],{"class":322},[312,820,458],{"class":322},[312,822,823,826,828,830,832,834,836],{"class":314,"line":461},[312,824,825],{"class":415},"    userId",[312,827,419],{"class":322},[312,829,327],{"class":326},[312,831,471],{"class":322},[312,833,474],{"class":403},[312,835,477],{"class":326},[312,837,430],{"class":322},[312,839,840],{"class":314,"line":499},[312,841,502],{"class":322},[312,843,844,846,848,850,852,855,857,859],{"class":314,"line":505},[312,845,508],{"class":403},[312,847,419],{"class":322},[312,849,514],{"class":513},[312,851,517],{"class":322},[312,853,854],{"class":520}," userId",[312,856,524],{"class":322},[312,858,527],{"class":513},[312,860,458],{"class":322},[312,862,863],{"class":314,"line":532},[312,864,866],{"class":865},"sHwdD","    \u002F\u002F ...\n",[312,868,869],{"class":314,"line":570},[312,870,502],{"class":322},[312,872,873,875],{"class":314,"line":637},[312,874,625],{"class":322},[312,876,567],{"class":326},[292,878,879],{"id":879},"从目录自动推断分组",[297,881,882],{},"将工具放在子目录中，系统会自动推断分组：",[301,884,889],{"className":885,"code":887,"language":888},[886],"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","text",[309,890,887],{"__ignoreMap":307},[297,892,893,894,896],{},"在定义中显式设置的 ",[309,895,664],{}," 始终优先于从目录推断的值。",[292,898,899],{"id":899},"客户端如何查看分组和标签",[297,901,902,903,906,907,909],{},"分组和标签包含在 ",[309,904,905],{},"tools\u002Flist"," 响应的 ",[309,908,672],{}," 字段中：",[301,911,915],{"className":912,"code":913,"language":914,"meta":307,"style":307},"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",[309,916,917,921,943,955,975,1004,1009],{"__ignoreMap":307},[312,918,919],{"class":314,"line":315},[312,920,409],{"class":322},[312,922,923,926,929,931,933,936,939,941],{"class":314,"line":346},[312,924,925],{"class":322},"  \"",[312,927,928],{"class":513},"name",[312,930,628],{"class":322},[312,932,419],{"class":322},[312,934,935],{"class":322}," \"",[312,937,938],{"class":339},"delete-user",[312,940,628],{"class":322},[312,942,430],{"class":322},[312,944,945,947,949,951,953],{"class":314,"line":366},[312,946,925],{"class":322},[312,948,672],{"class":513},[312,950,628],{"class":322},[312,952,419],{"class":322},[312,954,458],{"class":322},[312,956,957,960,963,965,967,969,971,973],{"class":314,"line":387},[312,958,959],{"class":322},"    \"",[312,961,664],{"class":962},"sBMFI",[312,964,628],{"class":322},[312,966,419],{"class":322},[312,968,935],{"class":322},[312,970,762],{"class":339},[312,972,628],{"class":322},[312,974,430],{"class":322},[312,976,977,979,981,983,985,987,989,991,993,995,997,999,1001],{"class":314,"line":394},[312,978,959],{"class":322},[312,980,668],{"class":962},[312,982,628],{"class":322},[312,984,419],{"class":322},[312,986,776],{"class":322},[312,988,628],{"class":322},[312,990,781],{"class":339},[312,992,628],{"class":322},[312,994,607],{"class":322},[312,996,935],{"class":322},[312,998,790],{"class":339},[312,1000,628],{"class":322},[312,1002,1003],{"class":322},"]\n",[312,1005,1006],{"class":314,"line":412},[312,1007,1008],{"class":322},"  }\n",[312,1010,1011],{"class":314,"line":433},[312,1012,1013],{"class":322},"}\n",[297,1015,1016],{},"MCP 客户端可以使用这些值在其 UI 中筛选、排序或对工具分组。",[1018,1019,1022,1023,665,1027,1030,1031,665,1033,1035,1036,1039,1040,1043,1044,1047],"callout",{"color":1020,"icon":1021},"info","i-lucide-info","对于 ",[1024,1025,1026],"strong",{},"resources",[1024,1028,1029],{},"prompts","，",[309,1032,664],{},[309,1034,668],{}," 会保存在定义对象上，但尚未在协议响应中暴露（",[309,1037,1038],{},"resources\u002Flist","、",[309,1041,1042],{},"prompts\u002Flist","）。当 MCP SDK 采用 ",[675,1045,680],{"href":677,"rel":1046},[679]," 时，将支持这一点。",[288,1049,1050],{"id":1050},"文件组织",[297,1052,1053,1054,1057],{},"将你的工具组织在 ",[309,1055,1056],{},"server\u002Fmcp\u002Ftools\u002F"," 目录中。支持扁平和嵌套两种布局：",[301,1059,1062],{"className":1060,"code":1061,"language":888},[886],"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",[309,1063,1061],{"__ignoreMap":307},[297,1065,1066,1067,1069],{},"每个文件都应导出一个默认的工具定义。子目录会自动为其中的所有工具设置 ",[309,1068,664],{},"。",[288,1071,1072],{"id":1072},"类型安全",[297,1074,1075],{},"该模块提供完整的 TypeScript 类型推断：",[301,1077,1079],{"className":303,"code":1078,"language":306,"meta":307,"style":307},"\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",[309,1080,1081,1086,1105,1110,1114,1118,1123,1136,1145,1160,1179,1183],{"__ignoreMap":307},[312,1082,1083],{"class":314,"line":315},[312,1084,1085],{"class":865},"\u002F\u002F 输入类型会从 inputSchema 推断\n",[312,1087,1088,1091,1093,1095,1097,1099,1101,1103],{"class":314,"line":346},[312,1089,1090],{"class":962},"handler",[312,1092,419],{"class":322},[312,1094,514],{"class":513},[312,1096,517],{"class":322},[312,1098,610],{"class":520},[312,1100,524],{"class":322},[312,1102,527],{"class":513},[312,1104,458],{"class":322},[312,1106,1107],{"class":314,"line":366},[312,1108,1109],{"class":865},"  \u002F\u002F message 的类型为 string\n",[312,1111,1112],{"class":314,"line":387},[312,1113,1013],{"class":322},[312,1115,1116],{"class":314,"line":394},[312,1117,391],{"emptyLinePlaceholder":390},[312,1119,1120],{"class":314,"line":412},[312,1121,1122],{"class":865},"\u002F\u002F 输出类型会从 outputSchema 推断\n",[312,1124,1125,1128,1131,1134],{"class":314,"line":433},[312,1126,1127],{"class":513},"const",[312,1129,1130],{"class":326}," result ",[312,1132,1133],{"class":322},"=",[312,1135,458],{"class":322},[312,1137,1138,1141,1143],{"class":314,"line":450},[312,1139,1140],{"class":415},"  structuredContent",[312,1142,419],{"class":322},[312,1144,458],{"class":322},[312,1146,1147,1150,1152,1155,1157],{"class":314,"line":461},[312,1148,1149],{"class":415},"    bmi",[312,1151,419],{"class":322},[312,1153,1154],{"class":603}," 25.5",[312,1156,607],{"class":322},[312,1158,1159],{"class":865},"      \u002F\u002F number\n",[312,1161,1162,1165,1167,1169,1172,1174,1176],{"class":314,"line":499},[312,1163,1164],{"class":415},"    category",[312,1166,419],{"class":322},[312,1168,336],{"class":322},[312,1170,1171],{"class":339},"...",[312,1173,427],{"class":322},[312,1175,607],{"class":322},[312,1177,1178],{"class":865}," \u002F\u002F string\n",[312,1180,1181],{"class":314,"line":505},[312,1182,502],{"class":322},[312,1184,1185],{"class":314,"line":532},[312,1186,1013],{"class":322},[288,1188,1189],{"id":1189},"条件注册",[297,1191,1192,1193,1196],{},"你可以使用 ",[309,1194,1195],{},"enabled"," 守卫来控制工具是否对客户端可见：",[301,1198,1201],{"className":303,"code":1199,"filename":1200,"language":306,"meta":307,"style":307},"import { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'admin-tool',\n  description: '仅管理员可用的工具',\n  enabled: event => event.context.user?.role === 'admin',\n  handler: async () => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fadmin-tool.ts",[309,1202,1203,1221,1225,1237,1252,1267,1308,1323,1327,1331],{"__ignoreMap":307},[312,1204,1205,1207,1209,1211,1213,1215,1217,1219],{"class":314,"line":315},[312,1206,319],{"class":318},[312,1208,323],{"class":322},[312,1210,373],{"class":326},[312,1212,330],{"class":322},[312,1214,333],{"class":318},[312,1216,336],{"class":322},[312,1218,382],{"class":339},[312,1220,343],{"class":322},[312,1222,1223],{"class":314,"line":346},[312,1224,391],{"emptyLinePlaceholder":390},[312,1226,1227,1229,1231,1233,1235],{"class":314,"line":366},[312,1228,397],{"class":318},[312,1230,400],{"class":318},[312,1232,373],{"class":403},[312,1234,406],{"class":326},[312,1236,409],{"class":322},[312,1238,1239,1241,1243,1245,1248,1250],{"class":314,"line":387},[312,1240,416],{"class":415},[312,1242,419],{"class":322},[312,1244,336],{"class":322},[312,1246,1247],{"class":339},"admin-tool",[312,1249,427],{"class":322},[312,1251,430],{"class":322},[312,1253,1254,1256,1258,1260,1263,1265],{"class":314,"line":394},[312,1255,436],{"class":415},[312,1257,419],{"class":322},[312,1259,336],{"class":322},[312,1261,1262],{"class":339},"仅管理员可用的工具",[312,1264,427],{"class":322},[312,1266,430],{"class":322},[312,1268,1269,1272,1274,1277,1279,1281,1283,1286,1288,1291,1294,1297,1300,1302,1304,1306],{"class":314,"line":412},[312,1270,1271],{"class":403},"  enabled",[312,1273,419],{"class":322},[312,1275,1276],{"class":520}," event",[312,1278,527],{"class":513},[312,1280,1276],{"class":326},[312,1282,471],{"class":322},[312,1284,1285],{"class":326},"context",[312,1287,471],{"class":322},[312,1289,1290],{"class":326},"user",[312,1292,1293],{"class":322},"?.",[312,1295,1296],{"class":326},"role ",[312,1298,1299],{"class":322},"===",[312,1301,336],{"class":322},[312,1303,762],{"class":339},[312,1305,427],{"class":322},[312,1307,430],{"class":322},[312,1309,1310,1312,1314,1316,1319,1321],{"class":314,"line":433},[312,1311,508],{"class":403},[312,1313,419],{"class":322},[312,1315,514],{"class":513},[312,1317,1318],{"class":322}," ()",[312,1320,527],{"class":513},[312,1322,458],{"class":322},[312,1324,1325],{"class":314,"line":450},[312,1326,866],{"class":865},[312,1328,1329],{"class":314,"line":461},[312,1330,502],{"class":322},[312,1332,1333,1335],{"class":314,"line":499},[312,1334,625],{"class":322},[312,1336,567],{"class":326},[297,1338,1339,1340,1342,1343,1346,1347,1349],{},"当 ",[309,1341,1195],{}," 返回 ",[309,1344,1345],{},"false"," 时，该工具会从 ",[309,1348,905],{}," 中隐藏，并且无法被调用。",[1018,1351,1353,1354,1356],{"color":1352,"icon":13},"primary","有关基于认证过滤的详细文档，请参阅 ",[675,1355,239],{"href":240}," 指南。",[288,1358,1359],{"id":1359},"下一步",[1361,1362,1363,1369,1374,1379,1385,1390],"ul",{},[1364,1365,1366,1368],"li",{},[675,1367,71],{"href":76}," - 创建资源以暴露数据",[1364,1370,1371,1373],{},[675,1372,100],{"href":105}," - 创建可复用的提示词",[1364,1375,1376,1378],{},[675,1377,123],{"href":128}," - 创建自定义 MCP 端点",[1364,1380,1381,1384],{},[675,1382,1383],{"href":245},"代码模式"," - 让 LLM 使用 JavaScript 协调工具",[1364,1386,1387,1389],{},[675,1388,239],{"href":240}," - 有条件地注册定义",[1364,1391,1392,1394],{},[675,1393,254],{"href":270}," - 查看更多工具示例",[1396,1397,1398],"style",{},"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":307,"searchDepth":346,"depth":346,"links":1400},[1401,1404,1409,1410,1411,1412],{"id":290,"depth":346,"text":290,"children":1402},[1403],{"id":294,"depth":366,"text":295},{"id":658,"depth":346,"text":658,"children":1405},[1406,1407,1408],{"id":684,"depth":366,"text":684},{"id":879,"depth":366,"text":879},{"id":899,"depth":366,"text":899},{"id":1050,"depth":346,"text":1050},{"id":1072,"depth":346,"text":1072},{"id":1189,"depth":346,"text":1189},{"id":1359,"depth":346,"text":1359},"工具的分组和标签、目录布局、类型安全以及启用守卫。","md",null,{},{"icon":69},{"title":1419,"description":1420},"工具分组、组织与动态注册","工具的分组、标签、文件布局、条件注册以及后续步骤。","dMKIQzWPXHfySwIVXVd-lQs4LxyD2TLrLGQKWNQ9Wmw",[1423,1425],{"title":61,"path":62,"stem":63,"description":1424,"icon":64,"children":-1},"工具处理器中的 H3 和普通错误，以及基于 Nitro 的响应缓存。",{"title":46,"path":76,"stem":77,"description":1426,"icon":78,"children":-1},"将只读数据源作为 MCP 资源暴露，为 AI 模型提供上下文。",1778659574536]