[{"data":1,"prerenderedAt":3027},["ShallowReactive",2],{"navigation_docs":3,"-advanced-middleware":139,"-advanced-middleware-surround":3022},[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":76,"body":141,"description":3013,"extension":3014,"links":3015,"meta":3016,"navigation":3017,"path":77,"seo":3018,"stem":78,"__hash__":3021},"docs\u002F3.advanced\u002F2.middleware.md",{"type":142,"value":143,"toc":2996},"minimark",[144,149,162,199,203,210,384,397,401,404,652,655,845,925,931,941,1159,1165,1225,1229,1593,1597,1957,1961,1972,2152,2155,2174,2435,2444,2448,2451,2662,2664,2667,2784,2787,2920,2924,2970,2974,2992],[145,146,148],"h2",{"id":147},"what-is-middleware","What is Middleware?",[150,151,152,153,157,158,161],"p",{},"Middleware allows you to run code ",[154,155,156],"strong",{},"before"," (and optionally ",[154,159,160],{},"after",") MCP requests are processed. This is useful for:",[163,164,165,171,177,187,193],"ul",{},[166,167,168,170],"li",{},[154,169,116],{}," - Validate tokens and set user context",[166,172,173,176],{},[154,174,175],{},"Logging"," - Track request timing and analytics",[166,178,179,182,183],{},[154,180,181],{},"Context"," - Pass data to your tools via ",[184,185,186],"code",{},"event.context",[166,188,189,192],{},[154,190,191],{},"Rate limiting"," - Control request frequency",[166,194,195,198],{},[154,196,197],{},"Error handling"," - Wrap handlers with try\u002Fcatch",[145,200,202],{"id":201},"basic-usage","Basic Usage",[150,204,205,206,209],{},"Add middleware to your handler using the ",[184,207,208],{},"middleware"," option:",[211,212,218],"pre",{"className":213,"code":214,"filename":215,"language":216,"meta":217,"style":217},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event) => {\n    \u002F\u002F Set context that tools can access\n    event.context.userId = 'user-123'\n    event.context.startTime = Date.now()\n  },\n})\n","server\u002Fmcp\u002Findex.ts","typescript","",[184,219,220,253,260,278,307,314,341,369,375],{"__ignoreMap":217},[221,222,225,229,233,237,240,243,246,250],"span",{"class":223,"line":224},"line",1,[221,226,228],{"class":227},"s7zQu","import",[221,230,232],{"class":231},"sMK4o"," {",[221,234,236],{"class":235},"sTEyZ"," defineMcpHandler",[221,238,239],{"class":231}," }",[221,241,242],{"class":227}," from",[221,244,245],{"class":231}," '",[221,247,249],{"class":248},"sfazB","@nuxtjs\u002Fmcp-toolkit\u002Fserver",[221,251,252],{"class":231},"'\n",[221,254,256],{"class":223,"line":255},2,[221,257,259],{"emptyLinePlaceholder":258},true,"\n",[221,261,263,266,269,272,275],{"class":223,"line":262},3,[221,264,265],{"class":227},"export",[221,267,268],{"class":227}," default",[221,270,236],{"class":271},"s2Zo4",[221,273,274],{"class":235},"(",[221,276,277],{"class":231},"{\n",[221,279,281,284,287,291,294,298,301,304],{"class":223,"line":280},4,[221,282,283],{"class":271},"  middleware",[221,285,286],{"class":231},":",[221,288,290],{"class":289},"spNyl"," async",[221,292,293],{"class":231}," (",[221,295,297],{"class":296},"sHdIc","event",[221,299,300],{"class":231},")",[221,302,303],{"class":289}," =>",[221,305,306],{"class":231}," {\n",[221,308,310],{"class":223,"line":309},5,[221,311,313],{"class":312},"sHwdD","    \u002F\u002F Set context that tools can access\n",[221,315,317,320,323,326,328,331,334,336,339],{"class":223,"line":316},6,[221,318,319],{"class":235},"    event",[221,321,322],{"class":231},".",[221,324,325],{"class":235},"context",[221,327,322],{"class":231},[221,329,330],{"class":235},"userId",[221,332,333],{"class":231}," =",[221,335,245],{"class":231},[221,337,338],{"class":248},"user-123",[221,340,252],{"class":231},[221,342,344,346,348,350,352,355,357,360,362,365],{"class":223,"line":343},7,[221,345,319],{"class":235},[221,347,322],{"class":231},[221,349,325],{"class":235},[221,351,322],{"class":231},[221,353,354],{"class":235},"startTime",[221,356,333],{"class":231},[221,358,359],{"class":235}," Date",[221,361,322],{"class":231},[221,363,364],{"class":271},"now",[221,366,368],{"class":367},"swJcz","()\n",[221,370,372],{"class":223,"line":371},8,[221,373,374],{"class":231},"  },\n",[221,376,378,381],{"class":223,"line":377},9,[221,379,380],{"class":231},"}",[221,382,383],{"class":235},")\n",[385,386,388,389,392,393,396],"callout",{"color":387,"icon":129},"primary","If you don't call ",[184,390,391],{},"next()",", the handler is called ",[154,394,395],{},"automatically"," after your middleware runs. This makes simple use cases straightforward.",[145,398,400],{"id":399},"simple-middleware","Simple Middleware",[150,402,403],{},"For most cases, you just need to set context or validate something before the handler runs:",[211,405,407],{"className":213,"code":406,"filename":215,"language":216,"meta":217,"style":217},"import { getHeader, createError } from 'h3'\nimport { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event) => {\n    \u002F\u002F Validate API key\n    const apiKey = getHeader(event, 'x-api-key')\n    if (!apiKey) {\n      throw createError({ statusCode: 401, message: 'API key required' })\n    }\n\n    \u002F\u002F Set user context for tools to access\n    event.context.apiKey = apiKey\n    event.context.user = await validateApiKey(apiKey)\n  },\n})\n",[184,408,409,435,453,457,469,487,492,520,538,577,583,588,594,612,640,645],{"__ignoreMap":217},[221,410,411,413,415,418,421,424,426,428,430,433],{"class":223,"line":224},[221,412,228],{"class":227},[221,414,232],{"class":231},[221,416,417],{"class":235}," getHeader",[221,419,420],{"class":231},",",[221,422,423],{"class":235}," createError",[221,425,239],{"class":231},[221,427,242],{"class":227},[221,429,245],{"class":231},[221,431,432],{"class":248},"h3",[221,434,252],{"class":231},[221,436,437,439,441,443,445,447,449,451],{"class":223,"line":255},[221,438,228],{"class":227},[221,440,232],{"class":231},[221,442,236],{"class":235},[221,444,239],{"class":231},[221,446,242],{"class":227},[221,448,245],{"class":231},[221,450,249],{"class":248},[221,452,252],{"class":231},[221,454,455],{"class":223,"line":262},[221,456,259],{"emptyLinePlaceholder":258},[221,458,459,461,463,465,467],{"class":223,"line":280},[221,460,265],{"class":227},[221,462,268],{"class":227},[221,464,236],{"class":271},[221,466,274],{"class":235},[221,468,277],{"class":231},[221,470,471,473,475,477,479,481,483,485],{"class":223,"line":309},[221,472,283],{"class":271},[221,474,286],{"class":231},[221,476,290],{"class":289},[221,478,293],{"class":231},[221,480,297],{"class":296},[221,482,300],{"class":231},[221,484,303],{"class":289},[221,486,306],{"class":231},[221,488,489],{"class":223,"line":316},[221,490,491],{"class":312},"    \u002F\u002F Validate API key\n",[221,493,494,497,500,502,504,506,508,510,512,515,518],{"class":223,"line":343},[221,495,496],{"class":289},"    const",[221,498,499],{"class":235}," apiKey",[221,501,333],{"class":231},[221,503,417],{"class":271},[221,505,274],{"class":367},[221,507,297],{"class":235},[221,509,420],{"class":231},[221,511,245],{"class":231},[221,513,514],{"class":248},"x-api-key",[221,516,517],{"class":231},"'",[221,519,383],{"class":367},[221,521,522,525,527,530,533,536],{"class":223,"line":371},[221,523,524],{"class":227},"    if",[221,526,293],{"class":367},[221,528,529],{"class":231},"!",[221,531,532],{"class":235},"apiKey",[221,534,535],{"class":367},") ",[221,537,277],{"class":231},[221,539,540,543,545,547,550,553,555,559,561,564,566,568,571,573,575],{"class":223,"line":377},[221,541,542],{"class":227},"      throw",[221,544,423],{"class":271},[221,546,274],{"class":367},[221,548,549],{"class":231},"{",[221,551,552],{"class":367}," statusCode",[221,554,286],{"class":231},[221,556,558],{"class":557},"sbssI"," 401",[221,560,420],{"class":231},[221,562,563],{"class":367}," message",[221,565,286],{"class":231},[221,567,245],{"class":231},[221,569,570],{"class":248},"API key required",[221,572,517],{"class":231},[221,574,239],{"class":231},[221,576,383],{"class":367},[221,578,580],{"class":223,"line":579},10,[221,581,582],{"class":231},"    }\n",[221,584,586],{"class":223,"line":585},11,[221,587,259],{"emptyLinePlaceholder":258},[221,589,591],{"class":223,"line":590},12,[221,592,593],{"class":312},"    \u002F\u002F Set user context for tools to access\n",[221,595,597,599,601,603,605,607,609],{"class":223,"line":596},13,[221,598,319],{"class":235},[221,600,322],{"class":231},[221,602,325],{"class":235},[221,604,322],{"class":231},[221,606,532],{"class":235},[221,608,333],{"class":231},[221,610,611],{"class":235}," apiKey\n",[221,613,615,617,619,621,623,626,628,631,634,636,638],{"class":223,"line":614},14,[221,616,319],{"class":235},[221,618,322],{"class":231},[221,620,325],{"class":235},[221,622,322],{"class":231},[221,624,625],{"class":235},"user",[221,627,333],{"class":231},[221,629,630],{"class":227}," await",[221,632,633],{"class":271}," validateApiKey",[221,635,274],{"class":367},[221,637,532],{"class":235},[221,639,383],{"class":367},[221,641,643],{"class":223,"line":642},15,[221,644,374],{"class":231},[221,646,648,650],{"class":223,"line":647},16,[221,649,380],{"class":231},[221,651,383],{"class":235},[150,653,654],{},"Your tools can then access this context:",[211,656,659],{"className":213,"code":657,"filename":658,"language":216,"meta":217,"style":217},"import { useEvent } from 'h3'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'my-tool',\n  description: 'A tool that uses middleware context',\n  inputSchema: {},\n  handler: async () => {\n    const event = useEvent()\n    const user = event.context.user\n    return `Hello, ${user.name}!`\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fmy-tool.ts",[184,660,661,680,699,703,715,732,748,758,774,787,807,835,839],{"__ignoreMap":217},[221,662,663,665,667,670,672,674,676,678],{"class":223,"line":224},[221,664,228],{"class":227},[221,666,232],{"class":231},[221,668,669],{"class":235}," useEvent",[221,671,239],{"class":231},[221,673,242],{"class":227},[221,675,245],{"class":231},[221,677,432],{"class":248},[221,679,252],{"class":231},[221,681,682,684,686,689,691,693,695,697],{"class":223,"line":255},[221,683,228],{"class":227},[221,685,232],{"class":231},[221,687,688],{"class":235}," defineMcpTool",[221,690,239],{"class":231},[221,692,242],{"class":227},[221,694,245],{"class":231},[221,696,249],{"class":248},[221,698,252],{"class":231},[221,700,701],{"class":223,"line":262},[221,702,259],{"emptyLinePlaceholder":258},[221,704,705,707,709,711,713],{"class":223,"line":280},[221,706,265],{"class":227},[221,708,268],{"class":227},[221,710,688],{"class":271},[221,712,274],{"class":235},[221,714,277],{"class":231},[221,716,717,720,722,724,727,729],{"class":223,"line":309},[221,718,719],{"class":367},"  name",[221,721,286],{"class":231},[221,723,245],{"class":231},[221,725,726],{"class":248},"my-tool",[221,728,517],{"class":231},[221,730,731],{"class":231},",\n",[221,733,734,737,739,741,744,746],{"class":223,"line":316},[221,735,736],{"class":367},"  description",[221,738,286],{"class":231},[221,740,245],{"class":231},[221,742,743],{"class":248},"A tool that uses middleware context",[221,745,517],{"class":231},[221,747,731],{"class":231},[221,749,750,753,755],{"class":223,"line":343},[221,751,752],{"class":367},"  inputSchema",[221,754,286],{"class":231},[221,756,757],{"class":231}," {},\n",[221,759,760,763,765,767,770,772],{"class":223,"line":371},[221,761,762],{"class":271},"  handler",[221,764,286],{"class":231},[221,766,290],{"class":289},[221,768,769],{"class":231}," ()",[221,771,303],{"class":289},[221,773,306],{"class":231},[221,775,776,778,781,783,785],{"class":223,"line":377},[221,777,496],{"class":289},[221,779,780],{"class":235}," event",[221,782,333],{"class":231},[221,784,669],{"class":271},[221,786,368],{"class":367},[221,788,789,791,794,796,798,800,802,804],{"class":223,"line":579},[221,790,496],{"class":289},[221,792,793],{"class":235}," user",[221,795,333],{"class":231},[221,797,780],{"class":235},[221,799,322],{"class":231},[221,801,325],{"class":235},[221,803,322],{"class":231},[221,805,806],{"class":235},"user\n",[221,808,809,812,815,818,821,823,825,828,830,832],{"class":223,"line":585},[221,810,811],{"class":227},"    return",[221,813,814],{"class":231}," `",[221,816,817],{"class":248},"Hello, ",[221,819,820],{"class":231},"${",[221,822,625],{"class":235},[221,824,322],{"class":231},[221,826,827],{"class":235},"name",[221,829,380],{"class":231},[221,831,529],{"class":248},[221,833,834],{"class":231},"`\n",[221,836,837],{"class":223,"line":590},[221,838,374],{"class":231},[221,840,841,843],{"class":223,"line":596},[221,842,380],{"class":231},[221,844,383],{"class":235},[385,846,849,860],{"color":847,"icon":848},"info","i-lucide-info",[150,850,851,852,855,856,859],{},"To use ",[184,853,854],{},"useEvent()"," in your tools, enable ",[184,857,858],{},"asyncContext"," in your Nuxt config:",[211,861,864],{"className":213,"code":862,"filename":863,"language":216,"meta":217,"style":217},"export default defineNuxtConfig({\n  nitro: {\n    experimental: {\n      asyncContext: true,\n    },\n  },\n})\n","nuxt.config.ts",[184,865,866,879,888,897,910,915,919],{"__ignoreMap":217},[221,867,868,870,872,875,877],{"class":223,"line":224},[221,869,265],{"class":227},[221,871,268],{"class":227},[221,873,874],{"class":271}," defineNuxtConfig",[221,876,274],{"class":235},[221,878,277],{"class":231},[221,880,881,884,886],{"class":223,"line":255},[221,882,883],{"class":367},"  nitro",[221,885,286],{"class":231},[221,887,306],{"class":231},[221,889,890,893,895],{"class":223,"line":262},[221,891,892],{"class":367},"    experimental",[221,894,286],{"class":231},[221,896,306],{"class":231},[221,898,899,902,904,908],{"class":223,"line":280},[221,900,901],{"class":367},"      asyncContext",[221,903,286],{"class":231},[221,905,907],{"class":906},"sfNiH"," true",[221,909,731],{"class":231},[221,911,912],{"class":223,"line":309},[221,913,914],{"class":231},"    },\n",[221,916,917],{"class":223,"line":316},[221,918,374],{"class":231},[221,920,921,923],{"class":223,"line":343},[221,922,380],{"class":231},[221,924,383],{"class":235},[145,926,928,929],{"id":927},"advanced-middleware-with-next","Advanced Middleware with ",[184,930,391],{},[150,932,933,934,936,937,940],{},"For more control, call ",[184,935,391],{}," explicitly to run code ",[154,938,939],{},"before and after"," the handler:",[211,942,944],{"className":213,"code":943,"filename":215,"language":216,"meta":217,"style":217},"import { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event, next) => {\n    const startTime = Date.now()\n    console.log('[MCP] Request started:', event.path)\n\n    \u002F\u002F Call the handler\n    const response = await next()\n\n    \u002F\u002F Code after the handler\n    const duration = Date.now() - startTime\n    console.log(`[MCP] Request completed in ${duration}ms`)\n\n    return response\n  },\n})\n",[184,945,946,964,968,980,1003,1020,1050,1054,1059,1074,1078,1083,1107,1137,1141,1148,1152],{"__ignoreMap":217},[221,947,948,950,952,954,956,958,960,962],{"class":223,"line":224},[221,949,228],{"class":227},[221,951,232],{"class":231},[221,953,236],{"class":235},[221,955,239],{"class":231},[221,957,242],{"class":227},[221,959,245],{"class":231},[221,961,249],{"class":248},[221,963,252],{"class":231},[221,965,966],{"class":223,"line":255},[221,967,259],{"emptyLinePlaceholder":258},[221,969,970,972,974,976,978],{"class":223,"line":262},[221,971,265],{"class":227},[221,973,268],{"class":227},[221,975,236],{"class":271},[221,977,274],{"class":235},[221,979,277],{"class":231},[221,981,982,984,986,988,990,992,994,997,999,1001],{"class":223,"line":280},[221,983,283],{"class":271},[221,985,286],{"class":231},[221,987,290],{"class":289},[221,989,293],{"class":231},[221,991,297],{"class":296},[221,993,420],{"class":231},[221,995,996],{"class":296}," next",[221,998,300],{"class":231},[221,1000,303],{"class":289},[221,1002,306],{"class":231},[221,1004,1005,1007,1010,1012,1014,1016,1018],{"class":223,"line":309},[221,1006,496],{"class":289},[221,1008,1009],{"class":235}," startTime",[221,1011,333],{"class":231},[221,1013,359],{"class":235},[221,1015,322],{"class":231},[221,1017,364],{"class":271},[221,1019,368],{"class":367},[221,1021,1022,1025,1027,1030,1032,1034,1037,1039,1041,1043,1045,1048],{"class":223,"line":316},[221,1023,1024],{"class":235},"    console",[221,1026,322],{"class":231},[221,1028,1029],{"class":271},"log",[221,1031,274],{"class":367},[221,1033,517],{"class":231},[221,1035,1036],{"class":248},"[MCP] Request started:",[221,1038,517],{"class":231},[221,1040,420],{"class":231},[221,1042,780],{"class":235},[221,1044,322],{"class":231},[221,1046,1047],{"class":235},"path",[221,1049,383],{"class":367},[221,1051,1052],{"class":223,"line":343},[221,1053,259],{"emptyLinePlaceholder":258},[221,1055,1056],{"class":223,"line":371},[221,1057,1058],{"class":312},"    \u002F\u002F Call the handler\n",[221,1060,1061,1063,1066,1068,1070,1072],{"class":223,"line":377},[221,1062,496],{"class":289},[221,1064,1065],{"class":235}," response",[221,1067,333],{"class":231},[221,1069,630],{"class":227},[221,1071,996],{"class":271},[221,1073,368],{"class":367},[221,1075,1076],{"class":223,"line":579},[221,1077,259],{"emptyLinePlaceholder":258},[221,1079,1080],{"class":223,"line":585},[221,1081,1082],{"class":312},"    \u002F\u002F Code after the handler\n",[221,1084,1085,1087,1090,1092,1094,1096,1098,1101,1104],{"class":223,"line":590},[221,1086,496],{"class":289},[221,1088,1089],{"class":235}," duration",[221,1091,333],{"class":231},[221,1093,359],{"class":235},[221,1095,322],{"class":231},[221,1097,364],{"class":271},[221,1099,1100],{"class":367},"() ",[221,1102,1103],{"class":231},"-",[221,1105,1106],{"class":235}," startTime\n",[221,1108,1109,1111,1113,1115,1117,1120,1123,1125,1128,1130,1133,1135],{"class":223,"line":596},[221,1110,1024],{"class":235},[221,1112,322],{"class":231},[221,1114,1029],{"class":271},[221,1116,274],{"class":367},[221,1118,1119],{"class":231},"`",[221,1121,1122],{"class":248},"[MCP] Request completed in ",[221,1124,820],{"class":231},[221,1126,1127],{"class":235},"duration",[221,1129,380],{"class":231},[221,1131,1132],{"class":248},"ms",[221,1134,1119],{"class":231},[221,1136,383],{"class":367},[221,1138,1139],{"class":223,"line":614},[221,1140,259],{"emptyLinePlaceholder":258},[221,1142,1143,1145],{"class":223,"line":642},[221,1144,811],{"class":227},[221,1146,1147],{"class":235}," response\n",[221,1149,1150],{"class":223,"line":647},[221,1151,374],{"class":231},[221,1153,1155,1157],{"class":223,"line":1154},17,[221,1156,380],{"class":231},[221,1158,383],{"class":235},[432,1160,1162,1163],{"id":1161},"when-to-use-next","When to use ",[184,1164,391],{},[1166,1167,1168,1184],"table",{},[1169,1170,1171],"thead",{},[1172,1173,1174,1178],"tr",{},[1175,1176,1177],"th",{},"Use Case",[1175,1179,1180,1181,1183],{},"Need ",[184,1182,391],{},"?",[1185,1186,1187,1196,1203,1211,1218],"tbody",{},[1172,1188,1189,1193],{},[1190,1191,1192],"td",{},"Set context before handler",[1190,1194,1195],{},"No",[1172,1197,1198,1201],{},[1190,1199,1200],{},"Validate auth before handler",[1190,1202,1195],{},[1172,1204,1205,1208],{},[1190,1206,1207],{},"Log request timing",[1190,1209,1210],{},"Yes",[1172,1212,1213,1216],{},[1190,1214,1215],{},"Modify response",[1190,1217,1210],{},[1172,1219,1220,1223],{},[1190,1221,1222],{},"Catch errors",[1190,1224,1210],{},[145,1226,1228],{"id":1227},"authentication-example","Authentication Example",[211,1230,1232],{"className":213,"code":1231,"filename":215,"language":216,"meta":217,"style":217},"import { getHeader, createError } from 'h3'\nimport { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event) => {\n    const authHeader = getHeader(event, 'authorization')\n\n    if (!authHeader?.startsWith('Bearer ')) {\n      throw createError({\n        statusCode: 401,\n        message: 'Missing or invalid authorization header',\n      })\n    }\n\n    const token = authHeader.slice(7)\n\n    try {\n      const user = await verifyToken(token)\n      event.context.user = user\n      event.context.userId = user.id\n    }\n    catch {\n      throw createError({\n        statusCode: 401,\n        message: 'Invalid token',\n      })\n    }\n  },\n})\n",[184,1233,1234,1256,1274,1278,1290,1308,1334,1338,1369,1379,1390,1406,1413,1417,1421,1444,1448,1455,1477,1496,1518,1523,1531,1542,1553,1569,1576,1581,1586],{"__ignoreMap":217},[221,1235,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254],{"class":223,"line":224},[221,1237,228],{"class":227},[221,1239,232],{"class":231},[221,1241,417],{"class":235},[221,1243,420],{"class":231},[221,1245,423],{"class":235},[221,1247,239],{"class":231},[221,1249,242],{"class":227},[221,1251,245],{"class":231},[221,1253,432],{"class":248},[221,1255,252],{"class":231},[221,1257,1258,1260,1262,1264,1266,1268,1270,1272],{"class":223,"line":255},[221,1259,228],{"class":227},[221,1261,232],{"class":231},[221,1263,236],{"class":235},[221,1265,239],{"class":231},[221,1267,242],{"class":227},[221,1269,245],{"class":231},[221,1271,249],{"class":248},[221,1273,252],{"class":231},[221,1275,1276],{"class":223,"line":262},[221,1277,259],{"emptyLinePlaceholder":258},[221,1279,1280,1282,1284,1286,1288],{"class":223,"line":280},[221,1281,265],{"class":227},[221,1283,268],{"class":227},[221,1285,236],{"class":271},[221,1287,274],{"class":235},[221,1289,277],{"class":231},[221,1291,1292,1294,1296,1298,1300,1302,1304,1306],{"class":223,"line":309},[221,1293,283],{"class":271},[221,1295,286],{"class":231},[221,1297,290],{"class":289},[221,1299,293],{"class":231},[221,1301,297],{"class":296},[221,1303,300],{"class":231},[221,1305,303],{"class":289},[221,1307,306],{"class":231},[221,1309,1310,1312,1315,1317,1319,1321,1323,1325,1327,1330,1332],{"class":223,"line":316},[221,1311,496],{"class":289},[221,1313,1314],{"class":235}," authHeader",[221,1316,333],{"class":231},[221,1318,417],{"class":271},[221,1320,274],{"class":367},[221,1322,297],{"class":235},[221,1324,420],{"class":231},[221,1326,245],{"class":231},[221,1328,1329],{"class":248},"authorization",[221,1331,517],{"class":231},[221,1333,383],{"class":367},[221,1335,1336],{"class":223,"line":343},[221,1337,259],{"emptyLinePlaceholder":258},[221,1339,1340,1342,1344,1346,1349,1352,1355,1357,1359,1362,1364,1367],{"class":223,"line":371},[221,1341,524],{"class":227},[221,1343,293],{"class":367},[221,1345,529],{"class":231},[221,1347,1348],{"class":235},"authHeader",[221,1350,1351],{"class":231},"?.",[221,1353,1354],{"class":271},"startsWith",[221,1356,274],{"class":367},[221,1358,517],{"class":231},[221,1360,1361],{"class":248},"Bearer ",[221,1363,517],{"class":231},[221,1365,1366],{"class":367},")) ",[221,1368,277],{"class":231},[221,1370,1371,1373,1375,1377],{"class":223,"line":377},[221,1372,542],{"class":227},[221,1374,423],{"class":271},[221,1376,274],{"class":367},[221,1378,277],{"class":231},[221,1380,1381,1384,1386,1388],{"class":223,"line":579},[221,1382,1383],{"class":367},"        statusCode",[221,1385,286],{"class":231},[221,1387,558],{"class":557},[221,1389,731],{"class":231},[221,1391,1392,1395,1397,1399,1402,1404],{"class":223,"line":585},[221,1393,1394],{"class":367},"        message",[221,1396,286],{"class":231},[221,1398,245],{"class":231},[221,1400,1401],{"class":248},"Missing or invalid authorization header",[221,1403,517],{"class":231},[221,1405,731],{"class":231},[221,1407,1408,1411],{"class":223,"line":590},[221,1409,1410],{"class":231},"      }",[221,1412,383],{"class":367},[221,1414,1415],{"class":223,"line":596},[221,1416,582],{"class":231},[221,1418,1419],{"class":223,"line":614},[221,1420,259],{"emptyLinePlaceholder":258},[221,1422,1423,1425,1428,1430,1432,1434,1437,1439,1442],{"class":223,"line":642},[221,1424,496],{"class":289},[221,1426,1427],{"class":235}," token",[221,1429,333],{"class":231},[221,1431,1314],{"class":235},[221,1433,322],{"class":231},[221,1435,1436],{"class":271},"slice",[221,1438,274],{"class":367},[221,1440,1441],{"class":557},"7",[221,1443,383],{"class":367},[221,1445,1446],{"class":223,"line":647},[221,1447,259],{"emptyLinePlaceholder":258},[221,1449,1450,1453],{"class":223,"line":1154},[221,1451,1452],{"class":227},"    try",[221,1454,306],{"class":231},[221,1456,1458,1461,1463,1465,1467,1470,1472,1475],{"class":223,"line":1457},18,[221,1459,1460],{"class":289},"      const",[221,1462,793],{"class":235},[221,1464,333],{"class":231},[221,1466,630],{"class":227},[221,1468,1469],{"class":271}," verifyToken",[221,1471,274],{"class":367},[221,1473,1474],{"class":235},"token",[221,1476,383],{"class":367},[221,1478,1480,1483,1485,1487,1489,1491,1493],{"class":223,"line":1479},19,[221,1481,1482],{"class":235},"      event",[221,1484,322],{"class":231},[221,1486,325],{"class":235},[221,1488,322],{"class":231},[221,1490,625],{"class":235},[221,1492,333],{"class":231},[221,1494,1495],{"class":235}," user\n",[221,1497,1499,1501,1503,1505,1507,1509,1511,1513,1515],{"class":223,"line":1498},20,[221,1500,1482],{"class":235},[221,1502,322],{"class":231},[221,1504,325],{"class":235},[221,1506,322],{"class":231},[221,1508,330],{"class":235},[221,1510,333],{"class":231},[221,1512,793],{"class":235},[221,1514,322],{"class":231},[221,1516,1517],{"class":235},"id\n",[221,1519,1521],{"class":223,"line":1520},21,[221,1522,582],{"class":231},[221,1524,1526,1529],{"class":223,"line":1525},22,[221,1527,1528],{"class":227},"    catch",[221,1530,306],{"class":231},[221,1532,1534,1536,1538,1540],{"class":223,"line":1533},23,[221,1535,542],{"class":227},[221,1537,423],{"class":271},[221,1539,274],{"class":367},[221,1541,277],{"class":231},[221,1543,1545,1547,1549,1551],{"class":223,"line":1544},24,[221,1546,1383],{"class":367},[221,1548,286],{"class":231},[221,1550,558],{"class":557},[221,1552,731],{"class":231},[221,1554,1556,1558,1560,1562,1565,1567],{"class":223,"line":1555},25,[221,1557,1394],{"class":367},[221,1559,286],{"class":231},[221,1561,245],{"class":231},[221,1563,1564],{"class":248},"Invalid token",[221,1566,517],{"class":231},[221,1568,731],{"class":231},[221,1570,1572,1574],{"class":223,"line":1571},26,[221,1573,1410],{"class":231},[221,1575,383],{"class":367},[221,1577,1579],{"class":223,"line":1578},27,[221,1580,582],{"class":231},[221,1582,1584],{"class":223,"line":1583},28,[221,1585,374],{"class":231},[221,1587,1589,1591],{"class":223,"line":1588},29,[221,1590,380],{"class":231},[221,1592,383],{"class":235},[145,1594,1596],{"id":1595},"logging-analytics-example","Logging & Analytics Example",[211,1598,1600],{"className":213,"code":1599,"filename":215,"language":216,"meta":217,"style":217},"import { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event, next) => {\n    const requestId = crypto.randomUUID()\n    const startTime = Date.now()\n\n    event.context.requestId = requestId\n\n    console.log(JSON.stringify({\n      type: 'mcp_request_start',\n      requestId,\n      path: event.path,\n      method: event.method,\n      timestamp: new Date().toISOString(),\n    }))\n\n    const response = await next()\n\n    console.log(JSON.stringify({\n      type: 'mcp_request_end',\n      requestId,\n      duration: Date.now() - startTime,\n      timestamp: new Date().toISOString(),\n    }))\n\n    return response\n  },\n})\n",[184,1601,1602,1620,1624,1636,1658,1677,1693,1697,1715,1719,1741,1757,1764,1779,1795,1819,1827,1831,1845,1849,1869,1884,1890,1911,1931,1937,1941,1947,1951],{"__ignoreMap":217},[221,1603,1604,1606,1608,1610,1612,1614,1616,1618],{"class":223,"line":224},[221,1605,228],{"class":227},[221,1607,232],{"class":231},[221,1609,236],{"class":235},[221,1611,239],{"class":231},[221,1613,242],{"class":227},[221,1615,245],{"class":231},[221,1617,249],{"class":248},[221,1619,252],{"class":231},[221,1621,1622],{"class":223,"line":255},[221,1623,259],{"emptyLinePlaceholder":258},[221,1625,1626,1628,1630,1632,1634],{"class":223,"line":262},[221,1627,265],{"class":227},[221,1629,268],{"class":227},[221,1631,236],{"class":271},[221,1633,274],{"class":235},[221,1635,277],{"class":231},[221,1637,1638,1640,1642,1644,1646,1648,1650,1652,1654,1656],{"class":223,"line":280},[221,1639,283],{"class":271},[221,1641,286],{"class":231},[221,1643,290],{"class":289},[221,1645,293],{"class":231},[221,1647,297],{"class":296},[221,1649,420],{"class":231},[221,1651,996],{"class":296},[221,1653,300],{"class":231},[221,1655,303],{"class":289},[221,1657,306],{"class":231},[221,1659,1660,1662,1665,1667,1670,1672,1675],{"class":223,"line":309},[221,1661,496],{"class":289},[221,1663,1664],{"class":235}," requestId",[221,1666,333],{"class":231},[221,1668,1669],{"class":235}," crypto",[221,1671,322],{"class":231},[221,1673,1674],{"class":271},"randomUUID",[221,1676,368],{"class":367},[221,1678,1679,1681,1683,1685,1687,1689,1691],{"class":223,"line":316},[221,1680,496],{"class":289},[221,1682,1009],{"class":235},[221,1684,333],{"class":231},[221,1686,359],{"class":235},[221,1688,322],{"class":231},[221,1690,364],{"class":271},[221,1692,368],{"class":367},[221,1694,1695],{"class":223,"line":343},[221,1696,259],{"emptyLinePlaceholder":258},[221,1698,1699,1701,1703,1705,1707,1710,1712],{"class":223,"line":371},[221,1700,319],{"class":235},[221,1702,322],{"class":231},[221,1704,325],{"class":235},[221,1706,322],{"class":231},[221,1708,1709],{"class":235},"requestId",[221,1711,333],{"class":231},[221,1713,1714],{"class":235}," requestId\n",[221,1716,1717],{"class":223,"line":377},[221,1718,259],{"emptyLinePlaceholder":258},[221,1720,1721,1723,1725,1727,1729,1732,1734,1737,1739],{"class":223,"line":579},[221,1722,1024],{"class":235},[221,1724,322],{"class":231},[221,1726,1029],{"class":271},[221,1728,274],{"class":367},[221,1730,1731],{"class":235},"JSON",[221,1733,322],{"class":231},[221,1735,1736],{"class":271},"stringify",[221,1738,274],{"class":367},[221,1740,277],{"class":231},[221,1742,1743,1746,1748,1750,1753,1755],{"class":223,"line":585},[221,1744,1745],{"class":367},"      type",[221,1747,286],{"class":231},[221,1749,245],{"class":231},[221,1751,1752],{"class":248},"mcp_request_start",[221,1754,517],{"class":231},[221,1756,731],{"class":231},[221,1758,1759,1762],{"class":223,"line":590},[221,1760,1761],{"class":235},"      requestId",[221,1763,731],{"class":231},[221,1765,1766,1769,1771,1773,1775,1777],{"class":223,"line":596},[221,1767,1768],{"class":367},"      path",[221,1770,286],{"class":231},[221,1772,780],{"class":235},[221,1774,322],{"class":231},[221,1776,1047],{"class":235},[221,1778,731],{"class":231},[221,1780,1781,1784,1786,1788,1790,1793],{"class":223,"line":614},[221,1782,1783],{"class":367},"      method",[221,1785,286],{"class":231},[221,1787,780],{"class":235},[221,1789,322],{"class":231},[221,1791,1792],{"class":235},"method",[221,1794,731],{"class":231},[221,1796,1797,1800,1802,1805,1807,1810,1812,1815,1817],{"class":223,"line":642},[221,1798,1799],{"class":367},"      timestamp",[221,1801,286],{"class":231},[221,1803,1804],{"class":231}," new",[221,1806,359],{"class":271},[221,1808,1809],{"class":367},"()",[221,1811,322],{"class":231},[221,1813,1814],{"class":271},"toISOString",[221,1816,1809],{"class":367},[221,1818,731],{"class":231},[221,1820,1821,1824],{"class":223,"line":647},[221,1822,1823],{"class":231},"    }",[221,1825,1826],{"class":367},"))\n",[221,1828,1829],{"class":223,"line":1154},[221,1830,259],{"emptyLinePlaceholder":258},[221,1832,1833,1835,1837,1839,1841,1843],{"class":223,"line":1457},[221,1834,496],{"class":289},[221,1836,1065],{"class":235},[221,1838,333],{"class":231},[221,1840,630],{"class":227},[221,1842,996],{"class":271},[221,1844,368],{"class":367},[221,1846,1847],{"class":223,"line":1479},[221,1848,259],{"emptyLinePlaceholder":258},[221,1850,1851,1853,1855,1857,1859,1861,1863,1865,1867],{"class":223,"line":1498},[221,1852,1024],{"class":235},[221,1854,322],{"class":231},[221,1856,1029],{"class":271},[221,1858,274],{"class":367},[221,1860,1731],{"class":235},[221,1862,322],{"class":231},[221,1864,1736],{"class":271},[221,1866,274],{"class":367},[221,1868,277],{"class":231},[221,1870,1871,1873,1875,1877,1880,1882],{"class":223,"line":1520},[221,1872,1745],{"class":367},[221,1874,286],{"class":231},[221,1876,245],{"class":231},[221,1878,1879],{"class":248},"mcp_request_end",[221,1881,517],{"class":231},[221,1883,731],{"class":231},[221,1885,1886,1888],{"class":223,"line":1525},[221,1887,1761],{"class":235},[221,1889,731],{"class":231},[221,1891,1892,1895,1897,1899,1901,1903,1905,1907,1909],{"class":223,"line":1533},[221,1893,1894],{"class":367},"      duration",[221,1896,286],{"class":231},[221,1898,359],{"class":235},[221,1900,322],{"class":231},[221,1902,364],{"class":271},[221,1904,1100],{"class":367},[221,1906,1103],{"class":231},[221,1908,1009],{"class":235},[221,1910,731],{"class":231},[221,1912,1913,1915,1917,1919,1921,1923,1925,1927,1929],{"class":223,"line":1544},[221,1914,1799],{"class":367},[221,1916,286],{"class":231},[221,1918,1804],{"class":231},[221,1920,359],{"class":271},[221,1922,1809],{"class":367},[221,1924,322],{"class":231},[221,1926,1814],{"class":271},[221,1928,1809],{"class":367},[221,1930,731],{"class":231},[221,1932,1933,1935],{"class":223,"line":1555},[221,1934,1823],{"class":231},[221,1936,1826],{"class":367},[221,1938,1939],{"class":223,"line":1571},[221,1940,259],{"emptyLinePlaceholder":258},[221,1942,1943,1945],{"class":223,"line":1578},[221,1944,811],{"class":227},[221,1946,1147],{"class":235},[221,1948,1949],{"class":223,"line":1583},[221,1950,374],{"class":231},[221,1952,1953,1955],{"class":223,"line":1588},[221,1954,380],{"class":231},[221,1956,383],{"class":235},[145,1958,1960],{"id":1959},"extracting-tool-names","Extracting Tool Names",[150,1962,1963,1964,1967,1968,1971],{},"Use the ",[184,1965,1966],{},"extractToolNames"," utility to inspect which tools are being called in the current request. It parses the JSON-RPC body and returns the tool names from any ",[184,1969,1970],{},"tools\u002Fcall"," messages.",[211,1973,1975],{"className":213,"code":1974,"filename":215,"language":216,"meta":217,"style":217},"import { defineMcpHandler, extractToolNames } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event, next) => {\n    const toolNames = await extractToolNames(event)\n\n    if (toolNames.length > 0) {\n      console.log(`[MCP] Calling tools: ${toolNames.join(', ')}`)\n    }\n\n    return next()\n  },\n})\n",[184,1976,1977,2000,2004,2016,2038,2057,2061,2085,2126,2130,2134,2142,2146],{"__ignoreMap":217},[221,1978,1979,1981,1983,1985,1987,1990,1992,1994,1996,1998],{"class":223,"line":224},[221,1980,228],{"class":227},[221,1982,232],{"class":231},[221,1984,236],{"class":235},[221,1986,420],{"class":231},[221,1988,1989],{"class":235}," extractToolNames",[221,1991,239],{"class":231},[221,1993,242],{"class":227},[221,1995,245],{"class":231},[221,1997,249],{"class":248},[221,1999,252],{"class":231},[221,2001,2002],{"class":223,"line":255},[221,2003,259],{"emptyLinePlaceholder":258},[221,2005,2006,2008,2010,2012,2014],{"class":223,"line":262},[221,2007,265],{"class":227},[221,2009,268],{"class":227},[221,2011,236],{"class":271},[221,2013,274],{"class":235},[221,2015,277],{"class":231},[221,2017,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036],{"class":223,"line":280},[221,2019,283],{"class":271},[221,2021,286],{"class":231},[221,2023,290],{"class":289},[221,2025,293],{"class":231},[221,2027,297],{"class":296},[221,2029,420],{"class":231},[221,2031,996],{"class":296},[221,2033,300],{"class":231},[221,2035,303],{"class":289},[221,2037,306],{"class":231},[221,2039,2040,2042,2045,2047,2049,2051,2053,2055],{"class":223,"line":309},[221,2041,496],{"class":289},[221,2043,2044],{"class":235}," toolNames",[221,2046,333],{"class":231},[221,2048,630],{"class":227},[221,2050,1989],{"class":271},[221,2052,274],{"class":367},[221,2054,297],{"class":235},[221,2056,383],{"class":367},[221,2058,2059],{"class":223,"line":316},[221,2060,259],{"emptyLinePlaceholder":258},[221,2062,2063,2065,2067,2070,2072,2075,2078,2081,2083],{"class":223,"line":343},[221,2064,524],{"class":227},[221,2066,293],{"class":367},[221,2068,2069],{"class":235},"toolNames",[221,2071,322],{"class":231},[221,2073,2074],{"class":235},"length",[221,2076,2077],{"class":231}," >",[221,2079,2080],{"class":557}," 0",[221,2082,535],{"class":367},[221,2084,277],{"class":231},[221,2086,2087,2090,2092,2094,2096,2098,2101,2103,2105,2107,2110,2112,2114,2117,2119,2121,2124],{"class":223,"line":371},[221,2088,2089],{"class":235},"      console",[221,2091,322],{"class":231},[221,2093,1029],{"class":271},[221,2095,274],{"class":367},[221,2097,1119],{"class":231},[221,2099,2100],{"class":248},"[MCP] Calling tools: ",[221,2102,820],{"class":231},[221,2104,2069],{"class":235},[221,2106,322],{"class":231},[221,2108,2109],{"class":271},"join",[221,2111,274],{"class":235},[221,2113,517],{"class":231},[221,2115,2116],{"class":248},", ",[221,2118,517],{"class":231},[221,2120,300],{"class":235},[221,2122,2123],{"class":231},"}`",[221,2125,383],{"class":367},[221,2127,2128],{"class":223,"line":377},[221,2129,582],{"class":231},[221,2131,2132],{"class":223,"line":579},[221,2133,259],{"emptyLinePlaceholder":258},[221,2135,2136,2138,2140],{"class":223,"line":585},[221,2137,811],{"class":227},[221,2139,996],{"class":271},[221,2141,368],{"class":367},[221,2143,2144],{"class":223,"line":590},[221,2145,374],{"class":231},[221,2147,2148,2150],{"class":223,"line":596},[221,2149,380],{"class":231},[221,2151,383],{"class":235},[150,2153,2154],{},"This is useful for:",[163,2156,2157,2162,2168],{},[166,2158,2159,2161],{},[154,2160,175],{}," which tools are called per request",[166,2163,2164,2167],{},[154,2165,2166],{},"Monitoring"," tool usage and frequency",[166,2169,2170,2173],{},[154,2171,2172],{},"Access control"," based on tool names (e.g. restricting certain tools to admin users)",[211,2175,2177],{"className":213,"code":2176,"filename":215,"language":216,"meta":217,"style":217},"import { createError } from 'h3'\nimport { defineMcpHandler, extractToolNames } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nconst ADMIN_TOOLS = ['delete-user', 'reset-database']\n\nexport default defineMcpHandler({\n  middleware: async (event) => {\n    const toolNames = await extractToolNames(event)\n    const user = event.context.user\n\n    if (toolNames.some(name => ADMIN_TOOLS.includes(name)) && user?.role !== 'admin') {\n      throw createError({ statusCode: 403, message: 'Admin access required for this tool' })\n    }\n  },\n})\n",[184,2178,2179,2197,2219,2223,2256,2260,2272,2290,2308,2326,2330,2387,2421,2425,2429],{"__ignoreMap":217},[221,2180,2181,2183,2185,2187,2189,2191,2193,2195],{"class":223,"line":224},[221,2182,228],{"class":227},[221,2184,232],{"class":231},[221,2186,423],{"class":235},[221,2188,239],{"class":231},[221,2190,242],{"class":227},[221,2192,245],{"class":231},[221,2194,432],{"class":248},[221,2196,252],{"class":231},[221,2198,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217],{"class":223,"line":255},[221,2200,228],{"class":227},[221,2202,232],{"class":231},[221,2204,236],{"class":235},[221,2206,420],{"class":231},[221,2208,1989],{"class":235},[221,2210,239],{"class":231},[221,2212,242],{"class":227},[221,2214,245],{"class":231},[221,2216,249],{"class":248},[221,2218,252],{"class":231},[221,2220,2221],{"class":223,"line":262},[221,2222,259],{"emptyLinePlaceholder":258},[221,2224,2225,2228,2231,2234,2237,2239,2242,2244,2246,2248,2251,2253],{"class":223,"line":280},[221,2226,2227],{"class":289},"const",[221,2229,2230],{"class":235}," ADMIN_TOOLS ",[221,2232,2233],{"class":231},"=",[221,2235,2236],{"class":235}," [",[221,2238,517],{"class":231},[221,2240,2241],{"class":248},"delete-user",[221,2243,517],{"class":231},[221,2245,420],{"class":231},[221,2247,245],{"class":231},[221,2249,2250],{"class":248},"reset-database",[221,2252,517],{"class":231},[221,2254,2255],{"class":235},"]\n",[221,2257,2258],{"class":223,"line":309},[221,2259,259],{"emptyLinePlaceholder":258},[221,2261,2262,2264,2266,2268,2270],{"class":223,"line":316},[221,2263,265],{"class":227},[221,2265,268],{"class":227},[221,2267,236],{"class":271},[221,2269,274],{"class":235},[221,2271,277],{"class":231},[221,2273,2274,2276,2278,2280,2282,2284,2286,2288],{"class":223,"line":343},[221,2275,283],{"class":271},[221,2277,286],{"class":231},[221,2279,290],{"class":289},[221,2281,293],{"class":231},[221,2283,297],{"class":296},[221,2285,300],{"class":231},[221,2287,303],{"class":289},[221,2289,306],{"class":231},[221,2291,2292,2294,2296,2298,2300,2302,2304,2306],{"class":223,"line":371},[221,2293,496],{"class":289},[221,2295,2044],{"class":235},[221,2297,333],{"class":231},[221,2299,630],{"class":227},[221,2301,1989],{"class":271},[221,2303,274],{"class":367},[221,2305,297],{"class":235},[221,2307,383],{"class":367},[221,2309,2310,2312,2314,2316,2318,2320,2322,2324],{"class":223,"line":377},[221,2311,496],{"class":289},[221,2313,793],{"class":235},[221,2315,333],{"class":231},[221,2317,780],{"class":235},[221,2319,322],{"class":231},[221,2321,325],{"class":235},[221,2323,322],{"class":231},[221,2325,806],{"class":235},[221,2327,2328],{"class":223,"line":579},[221,2329,259],{"emptyLinePlaceholder":258},[221,2331,2332,2334,2336,2338,2340,2343,2345,2347,2349,2352,2354,2357,2359,2361,2363,2366,2368,2370,2373,2376,2378,2381,2383,2385],{"class":223,"line":585},[221,2333,524],{"class":227},[221,2335,293],{"class":367},[221,2337,2069],{"class":235},[221,2339,322],{"class":231},[221,2341,2342],{"class":271},"some",[221,2344,274],{"class":367},[221,2346,827],{"class":296},[221,2348,303],{"class":289},[221,2350,2351],{"class":235}," ADMIN_TOOLS",[221,2353,322],{"class":231},[221,2355,2356],{"class":271},"includes",[221,2358,274],{"class":367},[221,2360,827],{"class":235},[221,2362,1366],{"class":367},[221,2364,2365],{"class":231},"&&",[221,2367,793],{"class":235},[221,2369,1351],{"class":231},[221,2371,2372],{"class":235},"role",[221,2374,2375],{"class":231}," !==",[221,2377,245],{"class":231},[221,2379,2380],{"class":248},"admin",[221,2382,517],{"class":231},[221,2384,535],{"class":367},[221,2386,277],{"class":231},[221,2388,2389,2391,2393,2395,2397,2399,2401,2404,2406,2408,2410,2412,2415,2417,2419],{"class":223,"line":590},[221,2390,542],{"class":227},[221,2392,423],{"class":271},[221,2394,274],{"class":367},[221,2396,549],{"class":231},[221,2398,552],{"class":367},[221,2400,286],{"class":231},[221,2402,2403],{"class":557}," 403",[221,2405,420],{"class":231},[221,2407,563],{"class":367},[221,2409,286],{"class":231},[221,2411,245],{"class":231},[221,2413,2414],{"class":248},"Admin access required for this tool",[221,2416,517],{"class":231},[221,2418,239],{"class":231},[221,2420,383],{"class":367},[221,2422,2423],{"class":223,"line":596},[221,2424,582],{"class":231},[221,2426,2427],{"class":223,"line":614},[221,2428,374],{"class":231},[221,2430,2431,2433],{"class":223,"line":642},[221,2432,380],{"class":231},[221,2434,383],{"class":235},[385,2436,2437,2439,2440,2443],{"color":387,"icon":129},[184,2438,1966],{}," is auto-imported in the server context — no import needed when using it in your ",[184,2441,2442],{},"server\u002F"," directory.",[145,2445,2447],{"id":2446},"middleware-with-custom-handlers","Middleware with Custom Handlers",[150,2449,2450],{},"Middleware works the same way with custom handlers:",[211,2452,2455],{"className":213,"code":2453,"filename":2454,"language":216,"meta":217,"style":217},"import { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  name: 'admin',\n  middleware: async (event) => {\n    const user = await getUser(event)\n\n    if (user?.role !== 'admin') {\n      throw createError({\n        statusCode: 403,\n        message: 'Admin access required',\n      })\n    }\n\n    event.context.user = user\n  },\n  tools: [adminTool1, adminTool2],\n})\n","server\u002Fmcp\u002Fadmin.ts",[184,2456,2457,2475,2479,2491,2505,2523,2542,2546,2570,2580,2590,2605,2611,2615,2619,2635,2639,2656],{"__ignoreMap":217},[221,2458,2459,2461,2463,2465,2467,2469,2471,2473],{"class":223,"line":224},[221,2460,228],{"class":227},[221,2462,232],{"class":231},[221,2464,236],{"class":235},[221,2466,239],{"class":231},[221,2468,242],{"class":227},[221,2470,245],{"class":231},[221,2472,249],{"class":248},[221,2474,252],{"class":231},[221,2476,2477],{"class":223,"line":255},[221,2478,259],{"emptyLinePlaceholder":258},[221,2480,2481,2483,2485,2487,2489],{"class":223,"line":262},[221,2482,265],{"class":227},[221,2484,268],{"class":227},[221,2486,236],{"class":271},[221,2488,274],{"class":235},[221,2490,277],{"class":231},[221,2492,2493,2495,2497,2499,2501,2503],{"class":223,"line":280},[221,2494,719],{"class":367},[221,2496,286],{"class":231},[221,2498,245],{"class":231},[221,2500,2380],{"class":248},[221,2502,517],{"class":231},[221,2504,731],{"class":231},[221,2506,2507,2509,2511,2513,2515,2517,2519,2521],{"class":223,"line":309},[221,2508,283],{"class":271},[221,2510,286],{"class":231},[221,2512,290],{"class":289},[221,2514,293],{"class":231},[221,2516,297],{"class":296},[221,2518,300],{"class":231},[221,2520,303],{"class":289},[221,2522,306],{"class":231},[221,2524,2525,2527,2529,2531,2533,2536,2538,2540],{"class":223,"line":316},[221,2526,496],{"class":289},[221,2528,793],{"class":235},[221,2530,333],{"class":231},[221,2532,630],{"class":227},[221,2534,2535],{"class":271}," getUser",[221,2537,274],{"class":367},[221,2539,297],{"class":235},[221,2541,383],{"class":367},[221,2543,2544],{"class":223,"line":343},[221,2545,259],{"emptyLinePlaceholder":258},[221,2547,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568],{"class":223,"line":371},[221,2549,524],{"class":227},[221,2551,293],{"class":367},[221,2553,625],{"class":235},[221,2555,1351],{"class":231},[221,2557,2372],{"class":235},[221,2559,2375],{"class":231},[221,2561,245],{"class":231},[221,2563,2380],{"class":248},[221,2565,517],{"class":231},[221,2567,535],{"class":367},[221,2569,277],{"class":231},[221,2571,2572,2574,2576,2578],{"class":223,"line":377},[221,2573,542],{"class":227},[221,2575,423],{"class":271},[221,2577,274],{"class":367},[221,2579,277],{"class":231},[221,2581,2582,2584,2586,2588],{"class":223,"line":579},[221,2583,1383],{"class":367},[221,2585,286],{"class":231},[221,2587,2403],{"class":557},[221,2589,731],{"class":231},[221,2591,2592,2594,2596,2598,2601,2603],{"class":223,"line":585},[221,2593,1394],{"class":367},[221,2595,286],{"class":231},[221,2597,245],{"class":231},[221,2599,2600],{"class":248},"Admin access required",[221,2602,517],{"class":231},[221,2604,731],{"class":231},[221,2606,2607,2609],{"class":223,"line":590},[221,2608,1410],{"class":231},[221,2610,383],{"class":367},[221,2612,2613],{"class":223,"line":596},[221,2614,582],{"class":231},[221,2616,2617],{"class":223,"line":614},[221,2618,259],{"emptyLinePlaceholder":258},[221,2620,2621,2623,2625,2627,2629,2631,2633],{"class":223,"line":642},[221,2622,319],{"class":235},[221,2624,322],{"class":231},[221,2626,325],{"class":235},[221,2628,322],{"class":231},[221,2630,625],{"class":235},[221,2632,333],{"class":231},[221,2634,1495],{"class":235},[221,2636,2637],{"class":223,"line":647},[221,2638,374],{"class":231},[221,2640,2641,2644,2646,2649,2651,2654],{"class":223,"line":1154},[221,2642,2643],{"class":367},"  tools",[221,2645,286],{"class":231},[221,2647,2648],{"class":235}," [adminTool1",[221,2650,420],{"class":231},[221,2652,2653],{"class":235}," adminTool2]",[221,2655,731],{"class":231},[221,2657,2658,2660],{"class":223,"line":1457},[221,2659,380],{"class":231},[221,2661,383],{"class":235},[145,2663,81],{"id":216},[150,2665,2666],{},"For type-safe context, extend the H3 context:",[211,2668,2671],{"className":213,"code":2669,"filename":2670,"language":216,"meta":217,"style":217},"declare module 'h3' {\n  interface H3EventContext {\n    user?: {\n      id: string\n      name: string\n      role: 'user' | 'admin'\n    }\n    requestId?: string\n    startTime?: number\n  }\n}\n","server\u002Ftypes.ts",[184,2672,2673,2689,2700,2710,2720,2729,2751,2755,2764,2774,2779],{"__ignoreMap":217},[221,2674,2675,2678,2681,2683,2685,2687],{"class":223,"line":224},[221,2676,2677],{"class":289},"declare",[221,2679,2680],{"class":289}," module",[221,2682,245],{"class":231},[221,2684,432],{"class":248},[221,2686,517],{"class":231},[221,2688,306],{"class":231},[221,2690,2691,2694,2698],{"class":223,"line":255},[221,2692,2693],{"class":289},"  interface",[221,2695,2697],{"class":2696},"sBMFI"," H3EventContext",[221,2699,306],{"class":231},[221,2701,2702,2705,2708],{"class":223,"line":262},[221,2703,2704],{"class":367},"    user",[221,2706,2707],{"class":231},"?:",[221,2709,306],{"class":231},[221,2711,2712,2715,2717],{"class":223,"line":280},[221,2713,2714],{"class":367},"      id",[221,2716,286],{"class":231},[221,2718,2719],{"class":2696}," string\n",[221,2721,2722,2725,2727],{"class":223,"line":309},[221,2723,2724],{"class":367},"      name",[221,2726,286],{"class":231},[221,2728,2719],{"class":2696},[221,2730,2731,2734,2736,2738,2740,2742,2745,2747,2749],{"class":223,"line":316},[221,2732,2733],{"class":367},"      role",[221,2735,286],{"class":231},[221,2737,245],{"class":231},[221,2739,625],{"class":248},[221,2741,517],{"class":231},[221,2743,2744],{"class":231}," |",[221,2746,245],{"class":231},[221,2748,2380],{"class":248},[221,2750,252],{"class":231},[221,2752,2753],{"class":223,"line":343},[221,2754,582],{"class":231},[221,2756,2757,2760,2762],{"class":223,"line":371},[221,2758,2759],{"class":367},"    requestId",[221,2761,2707],{"class":231},[221,2763,2719],{"class":2696},[221,2765,2766,2769,2771],{"class":223,"line":377},[221,2767,2768],{"class":367},"    startTime",[221,2770,2707],{"class":231},[221,2772,2773],{"class":2696}," number\n",[221,2775,2776],{"class":223,"line":579},[221,2777,2778],{"class":231},"  }\n",[221,2780,2781],{"class":223,"line":585},[221,2782,2783],{"class":231},"}\n",[150,2785,2786],{},"Now your middleware and tools will have typed context:",[211,2788,2790],{"className":213,"code":2789,"filename":215,"language":216,"meta":217,"style":217},"import { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({\n  middleware: async (event) => {\n    event.context.user = {\n      id: 'user-123',\n      name: 'John',\n      role: 'admin', \u002F\u002F TypeScript will validate this\n    }\n  },\n})\n",[184,2791,2792,2810,2814,2826,2844,2860,2874,2889,2906,2910,2914],{"__ignoreMap":217},[221,2793,2794,2796,2798,2800,2802,2804,2806,2808],{"class":223,"line":224},[221,2795,228],{"class":227},[221,2797,232],{"class":231},[221,2799,236],{"class":235},[221,2801,239],{"class":231},[221,2803,242],{"class":227},[221,2805,245],{"class":231},[221,2807,249],{"class":248},[221,2809,252],{"class":231},[221,2811,2812],{"class":223,"line":255},[221,2813,259],{"emptyLinePlaceholder":258},[221,2815,2816,2818,2820,2822,2824],{"class":223,"line":262},[221,2817,265],{"class":227},[221,2819,268],{"class":227},[221,2821,236],{"class":271},[221,2823,274],{"class":235},[221,2825,277],{"class":231},[221,2827,2828,2830,2832,2834,2836,2838,2840,2842],{"class":223,"line":280},[221,2829,283],{"class":271},[221,2831,286],{"class":231},[221,2833,290],{"class":289},[221,2835,293],{"class":231},[221,2837,297],{"class":296},[221,2839,300],{"class":231},[221,2841,303],{"class":289},[221,2843,306],{"class":231},[221,2845,2846,2848,2850,2852,2854,2856,2858],{"class":223,"line":309},[221,2847,319],{"class":235},[221,2849,322],{"class":231},[221,2851,325],{"class":235},[221,2853,322],{"class":231},[221,2855,625],{"class":235},[221,2857,333],{"class":231},[221,2859,306],{"class":231},[221,2861,2862,2864,2866,2868,2870,2872],{"class":223,"line":316},[221,2863,2714],{"class":367},[221,2865,286],{"class":231},[221,2867,245],{"class":231},[221,2869,338],{"class":248},[221,2871,517],{"class":231},[221,2873,731],{"class":231},[221,2875,2876,2878,2880,2882,2885,2887],{"class":223,"line":343},[221,2877,2724],{"class":367},[221,2879,286],{"class":231},[221,2881,245],{"class":231},[221,2883,2884],{"class":248},"John",[221,2886,517],{"class":231},[221,2888,731],{"class":231},[221,2890,2891,2893,2895,2897,2899,2901,2903],{"class":223,"line":371},[221,2892,2733],{"class":367},[221,2894,286],{"class":231},[221,2896,245],{"class":231},[221,2898,2380],{"class":248},[221,2900,517],{"class":231},[221,2902,420],{"class":231},[221,2904,2905],{"class":312}," \u002F\u002F TypeScript will validate this\n",[221,2907,2908],{"class":223,"line":377},[221,2909,582],{"class":231},[221,2911,2912],{"class":223,"line":579},[221,2913,374],{"class":231},[221,2915,2916,2918],{"class":223,"line":585},[221,2917,380],{"class":231},[221,2919,383],{"class":235},[145,2921,2923],{"id":2922},"best-practices","Best Practices",[2925,2926,2927,2933,2942,2954,2964],"ol",{},[166,2928,2929,2932],{},[154,2930,2931],{},"Keep middleware focused"," - Do one thing well",[166,2934,2935,2941],{},[154,2936,2937,2938,2940],{},"Don't call ",[184,2939,391],{}," if you don't need it"," - Let it be called automatically",[166,2943,2944,2950,2951,2953],{},[154,2945,2946,2947,2949],{},"Always return ",[184,2948,391],{}," result"," - If you call ",[184,2952,391],{},", return its result",[166,2955,2956,2959,2960,2963],{},[154,2957,2958],{},"Handle errors gracefully"," - Use ",[184,2961,2962],{},"createError"," for HTTP errors",[166,2965,2966,2969],{},[154,2967,2968],{},"Type your context"," - Extend H3EventContext for type safety",[145,2971,2973],{"id":2972},"next-steps","Next Steps",[163,2975,2976,2982,2987],{},[166,2977,2978,2981],{},[2979,2980,61],"a",{"href":62}," - Learn about custom handlers",[166,2983,2984,2986],{},[2979,2985,81],{"href":82}," - Type-safe definitions",[166,2988,2989,2991],{},[2979,2990,46],{"href":47}," - Create tools that use middleware context",[2993,2994,2995],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":217,"searchDepth":255,"depth":255,"links":2997},[2998,2999,3000,3001,3006,3007,3008,3009,3010,3011,3012],{"id":147,"depth":255,"text":148},{"id":201,"depth":255,"text":202},{"id":399,"depth":255,"text":400},{"id":927,"depth":255,"text":3002,"children":3003},"Advanced Middleware with next()",[3004],{"id":1161,"depth":262,"text":3005},"When to use next()",{"id":1227,"depth":255,"text":1228},{"id":1595,"depth":255,"text":1596},{"id":1959,"depth":255,"text":1960},{"id":2446,"depth":255,"text":2447},{"id":216,"depth":255,"text":81},{"id":2922,"depth":255,"text":2923},{"id":2972,"depth":255,"text":2973},"Intercept MCP requests to add authentication, logging, analytics, and more.","md",null,{},{"icon":79},{"title":3019,"description":3020},"MCP Middleware","Add middleware to your MCP handlers for authentication, logging, and request interception.","U_YYkz5atYcqXcDUUGucdQjBNj4F7EJdt0h5uR4Ff4U",[3023,3025],{"title":71,"path":72,"stem":73,"description":3024,"icon":74,"children":-1},"Customize where the module looks for MCP definitions.",{"title":81,"path":82,"stem":83,"description":3026,"icon":84,"children":-1},"Type safety and TypeScript features in the Nuxt MCP module.",1774006187987]