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