[{"data":1,"prerenderedAt":2384},["ShallowReactive",2],{"navigation_docs":3,"-advanced-middleware":139,"-advanced-middleware-surround":2379},[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":2370,"extension":2371,"links":2372,"meta":2373,"navigation":2374,"path":77,"seo":2375,"stem":78,"__hash__":2378},"docs\u002F3.advanced\u002F2.middleware.md",{"type":142,"value":143,"toc":2354},"minimark",[144,149,162,199,203,210,353,366,370,373,578,581,791,871,877,887,1081,1088,1148,1152,1500,1504,1842,1846,1849,2042,2044,2047,2164,2167,2278,2282,2328,2332,2350],[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","export 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,244,273,280,310,338,344],{"__ignoreMap":217},[221,222,225,229,232,236,240],"span",{"class":223,"line":224},"line",1,[221,226,228],{"class":227},"s7zQu","export",[221,230,231],{"class":227}," default",[221,233,235],{"class":234},"s2Zo4"," defineMcpHandler",[221,237,239],{"class":238},"sTEyZ","(",[221,241,243],{"class":242},"sMK4o","{\n",[221,245,247,250,253,257,260,264,267,270],{"class":223,"line":246},2,[221,248,249],{"class":234},"  middleware",[221,251,252],{"class":242},":",[221,254,256],{"class":255},"spNyl"," async",[221,258,259],{"class":242}," (",[221,261,263],{"class":262},"sHdIc","event",[221,265,266],{"class":242},")",[221,268,269],{"class":255}," =>",[221,271,272],{"class":242}," {\n",[221,274,276],{"class":223,"line":275},3,[221,277,279],{"class":278},"sHwdD","    \u002F\u002F Set context that tools can access\n",[221,281,283,286,289,292,294,297,300,303,307],{"class":223,"line":282},4,[221,284,285],{"class":238},"    event",[221,287,288],{"class":242},".",[221,290,291],{"class":238},"context",[221,293,288],{"class":242},[221,295,296],{"class":238},"userId",[221,298,299],{"class":242}," =",[221,301,302],{"class":242}," '",[221,304,306],{"class":305},"sfazB","user-123",[221,308,309],{"class":242},"'\n",[221,311,313,315,317,319,321,324,326,329,331,334],{"class":223,"line":312},5,[221,314,285],{"class":238},[221,316,288],{"class":242},[221,318,291],{"class":238},[221,320,288],{"class":242},[221,322,323],{"class":238},"startTime",[221,325,299],{"class":242},[221,327,328],{"class":238}," Date",[221,330,288],{"class":242},[221,332,333],{"class":234},"now",[221,335,337],{"class":336},"swJcz","()\n",[221,339,341],{"class":223,"line":340},6,[221,342,343],{"class":242},"  },\n",[221,345,347,350],{"class":223,"line":346},7,[221,348,349],{"class":242},"}",[221,351,352],{"class":238},")\n",[354,355,357,358,361,362,365],"callout",{"color":356,"icon":129},"primary","If you don't call ",[184,359,360],{},"next()",", the handler is called ",[154,363,364],{},"automatically"," after your middleware runs. This makes simple use cases straightforward.",[145,367,369],{"id":368},"simple-middleware","Simple Middleware",[150,371,372],{},"For most cases, you just need to set context or validate something before the handler runs:",[211,374,376],{"className":213,"code":375,"filename":215,"language":216,"meta":217,"style":217},"export 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,377,378,390,408,413,443,461,502,507,514,520,538,566,571],{"__ignoreMap":217},[221,379,380,382,384,386,388],{"class":223,"line":224},[221,381,228],{"class":227},[221,383,231],{"class":227},[221,385,235],{"class":234},[221,387,239],{"class":238},[221,389,243],{"class":242},[221,391,392,394,396,398,400,402,404,406],{"class":223,"line":246},[221,393,249],{"class":234},[221,395,252],{"class":242},[221,397,256],{"class":255},[221,399,259],{"class":242},[221,401,263],{"class":262},[221,403,266],{"class":242},[221,405,269],{"class":255},[221,407,272],{"class":242},[221,409,410],{"class":223,"line":275},[221,411,412],{"class":278},"    \u002F\u002F Validate API key\n",[221,414,415,418,421,423,426,428,430,433,435,438,441],{"class":223,"line":282},[221,416,417],{"class":255},"    const",[221,419,420],{"class":238}," apiKey",[221,422,299],{"class":242},[221,424,425],{"class":234}," getHeader",[221,427,239],{"class":336},[221,429,263],{"class":238},[221,431,432],{"class":242},",",[221,434,302],{"class":242},[221,436,437],{"class":305},"x-api-key",[221,439,440],{"class":242},"'",[221,442,352],{"class":336},[221,444,445,448,450,453,456,459],{"class":223,"line":312},[221,446,447],{"class":227},"    if",[221,449,259],{"class":336},[221,451,452],{"class":242},"!",[221,454,455],{"class":238},"apiKey",[221,457,458],{"class":336},") ",[221,460,243],{"class":242},[221,462,463,466,469,471,474,477,479,483,485,488,490,492,495,497,500],{"class":223,"line":340},[221,464,465],{"class":227},"      throw",[221,467,468],{"class":234}," createError",[221,470,239],{"class":336},[221,472,473],{"class":242},"{",[221,475,476],{"class":336}," statusCode",[221,478,252],{"class":242},[221,480,482],{"class":481},"sbssI"," 401",[221,484,432],{"class":242},[221,486,487],{"class":336}," message",[221,489,252],{"class":242},[221,491,302],{"class":242},[221,493,494],{"class":305},"API key required",[221,496,440],{"class":242},[221,498,499],{"class":242}," }",[221,501,352],{"class":336},[221,503,504],{"class":223,"line":346},[221,505,506],{"class":242},"    }\n",[221,508,510],{"class":223,"line":509},8,[221,511,513],{"emptyLinePlaceholder":512},true,"\n",[221,515,517],{"class":223,"line":516},9,[221,518,519],{"class":278},"    \u002F\u002F Set user context for tools to access\n",[221,521,523,525,527,529,531,533,535],{"class":223,"line":522},10,[221,524,285],{"class":238},[221,526,288],{"class":242},[221,528,291],{"class":238},[221,530,288],{"class":242},[221,532,455],{"class":238},[221,534,299],{"class":242},[221,536,537],{"class":238}," apiKey\n",[221,539,541,543,545,547,549,552,554,557,560,562,564],{"class":223,"line":540},11,[221,542,285],{"class":238},[221,544,288],{"class":242},[221,546,291],{"class":238},[221,548,288],{"class":242},[221,550,551],{"class":238},"user",[221,553,299],{"class":242},[221,555,556],{"class":227}," await",[221,558,559],{"class":234}," validateApiKey",[221,561,239],{"class":336},[221,563,455],{"class":238},[221,565,352],{"class":336},[221,567,569],{"class":223,"line":568},12,[221,570,343],{"class":242},[221,572,574,576],{"class":223,"line":573},13,[221,575,349],{"class":242},[221,577,352],{"class":238},[150,579,580],{},"Your tools can then access this context:",[211,582,585],{"className":213,"code":583,"filename":584,"language":216,"meta":217,"style":217},"export 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\n    return {\n      content: [{\n        type: 'text',\n        text: `Hello, ${user.name}!`,\n      }],\n    }\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fmy-tool.ts",[184,586,587,600,617,633,643,659,673,693,697,704,716,732,764,774,779,784],{"__ignoreMap":217},[221,588,589,591,593,596,598],{"class":223,"line":224},[221,590,228],{"class":227},[221,592,231],{"class":227},[221,594,595],{"class":234}," defineMcpTool",[221,597,239],{"class":238},[221,599,243],{"class":242},[221,601,602,605,607,609,612,614],{"class":223,"line":246},[221,603,604],{"class":336},"  name",[221,606,252],{"class":242},[221,608,302],{"class":242},[221,610,611],{"class":305},"my-tool",[221,613,440],{"class":242},[221,615,616],{"class":242},",\n",[221,618,619,622,624,626,629,631],{"class":223,"line":275},[221,620,621],{"class":336},"  description",[221,623,252],{"class":242},[221,625,302],{"class":242},[221,627,628],{"class":305},"A tool that uses middleware context",[221,630,440],{"class":242},[221,632,616],{"class":242},[221,634,635,638,640],{"class":223,"line":282},[221,636,637],{"class":336},"  inputSchema",[221,639,252],{"class":242},[221,641,642],{"class":242}," {},\n",[221,644,645,648,650,652,655,657],{"class":223,"line":312},[221,646,647],{"class":234},"  handler",[221,649,252],{"class":242},[221,651,256],{"class":255},[221,653,654],{"class":242}," ()",[221,656,269],{"class":255},[221,658,272],{"class":242},[221,660,661,663,666,668,671],{"class":223,"line":340},[221,662,417],{"class":255},[221,664,665],{"class":238}," event",[221,667,299],{"class":242},[221,669,670],{"class":234}," useEvent",[221,672,337],{"class":336},[221,674,675,677,680,682,684,686,688,690],{"class":223,"line":346},[221,676,417],{"class":255},[221,678,679],{"class":238}," user",[221,681,299],{"class":242},[221,683,665],{"class":238},[221,685,288],{"class":242},[221,687,291],{"class":238},[221,689,288],{"class":242},[221,691,692],{"class":238},"user\n",[221,694,695],{"class":223,"line":509},[221,696,513],{"emptyLinePlaceholder":512},[221,698,699,702],{"class":223,"line":516},[221,700,701],{"class":227},"    return",[221,703,272],{"class":242},[221,705,706,709,711,714],{"class":223,"line":522},[221,707,708],{"class":336},"      content",[221,710,252],{"class":242},[221,712,713],{"class":336}," [",[221,715,243],{"class":242},[221,717,718,721,723,725,728,730],{"class":223,"line":540},[221,719,720],{"class":336},"        type",[221,722,252],{"class":242},[221,724,302],{"class":242},[221,726,727],{"class":305},"text",[221,729,440],{"class":242},[221,731,616],{"class":242},[221,733,734,737,739,742,745,748,750,752,755,757,759,762],{"class":223,"line":568},[221,735,736],{"class":336},"        text",[221,738,252],{"class":242},[221,740,741],{"class":242}," `",[221,743,744],{"class":305},"Hello, ",[221,746,747],{"class":242},"${",[221,749,551],{"class":238},[221,751,288],{"class":242},[221,753,754],{"class":238},"name",[221,756,349],{"class":242},[221,758,452],{"class":305},[221,760,761],{"class":242},"`",[221,763,616],{"class":242},[221,765,766,769,772],{"class":223,"line":573},[221,767,768],{"class":242},"      }",[221,770,771],{"class":336},"]",[221,773,616],{"class":242},[221,775,777],{"class":223,"line":776},14,[221,778,506],{"class":242},[221,780,782],{"class":223,"line":781},15,[221,783,343],{"class":242},[221,785,787,789],{"class":223,"line":786},16,[221,788,349],{"class":242},[221,790,352],{"class":238},[354,792,795,806],{"color":793,"icon":794},"info","i-lucide-info",[150,796,797,798,801,802,805],{},"To use ",[184,799,800],{},"useEvent()"," in your tools, enable ",[184,803,804],{},"asyncContext"," in your Nuxt config:",[211,807,810],{"className":213,"code":808,"filename":809,"language":216,"meta":217,"style":217},"export default defineNuxtConfig({\n  nitro: {\n    experimental: {\n      asyncContext: true,\n    },\n  },\n})\n","nuxt.config.ts",[184,811,812,825,834,843,856,861,865],{"__ignoreMap":217},[221,813,814,816,818,821,823],{"class":223,"line":224},[221,815,228],{"class":227},[221,817,231],{"class":227},[221,819,820],{"class":234}," defineNuxtConfig",[221,822,239],{"class":238},[221,824,243],{"class":242},[221,826,827,830,832],{"class":223,"line":246},[221,828,829],{"class":336},"  nitro",[221,831,252],{"class":242},[221,833,272],{"class":242},[221,835,836,839,841],{"class":223,"line":275},[221,837,838],{"class":336},"    experimental",[221,840,252],{"class":242},[221,842,272],{"class":242},[221,844,845,848,850,854],{"class":223,"line":282},[221,846,847],{"class":336},"      asyncContext",[221,849,252],{"class":242},[221,851,853],{"class":852},"sfNiH"," true",[221,855,616],{"class":242},[221,857,858],{"class":223,"line":312},[221,859,860],{"class":242},"    },\n",[221,862,863],{"class":223,"line":340},[221,864,343],{"class":242},[221,866,867,869],{"class":223,"line":346},[221,868,349],{"class":242},[221,870,352],{"class":238},[145,872,874,875],{"id":873},"advanced-middleware-with-next","Advanced Middleware with ",[184,876,360],{},[150,878,879,880,882,883,886],{},"For more control, call ",[184,881,360],{}," explicitly to run code ",[154,884,885],{},"before and after"," the handler:",[211,888,890],{"className":213,"code":889,"filename":215,"language":216,"meta":217,"style":217},"export 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,891,892,904,927,944,974,978,983,998,1002,1007,1031,1060,1064,1071,1075],{"__ignoreMap":217},[221,893,894,896,898,900,902],{"class":223,"line":224},[221,895,228],{"class":227},[221,897,231],{"class":227},[221,899,235],{"class":234},[221,901,239],{"class":238},[221,903,243],{"class":242},[221,905,906,908,910,912,914,916,918,921,923,925],{"class":223,"line":246},[221,907,249],{"class":234},[221,909,252],{"class":242},[221,911,256],{"class":255},[221,913,259],{"class":242},[221,915,263],{"class":262},[221,917,432],{"class":242},[221,919,920],{"class":262}," next",[221,922,266],{"class":242},[221,924,269],{"class":255},[221,926,272],{"class":242},[221,928,929,931,934,936,938,940,942],{"class":223,"line":275},[221,930,417],{"class":255},[221,932,933],{"class":238}," startTime",[221,935,299],{"class":242},[221,937,328],{"class":238},[221,939,288],{"class":242},[221,941,333],{"class":234},[221,943,337],{"class":336},[221,945,946,949,951,954,956,958,961,963,965,967,969,972],{"class":223,"line":282},[221,947,948],{"class":238},"    console",[221,950,288],{"class":242},[221,952,953],{"class":234},"log",[221,955,239],{"class":336},[221,957,440],{"class":242},[221,959,960],{"class":305},"[MCP] Request started:",[221,962,440],{"class":242},[221,964,432],{"class":242},[221,966,665],{"class":238},[221,968,288],{"class":242},[221,970,971],{"class":238},"path",[221,973,352],{"class":336},[221,975,976],{"class":223,"line":312},[221,977,513],{"emptyLinePlaceholder":512},[221,979,980],{"class":223,"line":340},[221,981,982],{"class":278},"    \u002F\u002F Call the handler\n",[221,984,985,987,990,992,994,996],{"class":223,"line":346},[221,986,417],{"class":255},[221,988,989],{"class":238}," response",[221,991,299],{"class":242},[221,993,556],{"class":227},[221,995,920],{"class":234},[221,997,337],{"class":336},[221,999,1000],{"class":223,"line":509},[221,1001,513],{"emptyLinePlaceholder":512},[221,1003,1004],{"class":223,"line":516},[221,1005,1006],{"class":278},"    \u002F\u002F Code after the handler\n",[221,1008,1009,1011,1014,1016,1018,1020,1022,1025,1028],{"class":223,"line":522},[221,1010,417],{"class":255},[221,1012,1013],{"class":238}," duration",[221,1015,299],{"class":242},[221,1017,328],{"class":238},[221,1019,288],{"class":242},[221,1021,333],{"class":234},[221,1023,1024],{"class":336},"() ",[221,1026,1027],{"class":242},"-",[221,1029,1030],{"class":238}," startTime\n",[221,1032,1033,1035,1037,1039,1041,1043,1046,1048,1051,1053,1056,1058],{"class":223,"line":540},[221,1034,948],{"class":238},[221,1036,288],{"class":242},[221,1038,953],{"class":234},[221,1040,239],{"class":336},[221,1042,761],{"class":242},[221,1044,1045],{"class":305},"[MCP] Request completed in ",[221,1047,747],{"class":242},[221,1049,1050],{"class":238},"duration",[221,1052,349],{"class":242},[221,1054,1055],{"class":305},"ms",[221,1057,761],{"class":242},[221,1059,352],{"class":336},[221,1061,1062],{"class":223,"line":568},[221,1063,513],{"emptyLinePlaceholder":512},[221,1065,1066,1068],{"class":223,"line":573},[221,1067,701],{"class":227},[221,1069,1070],{"class":238}," response\n",[221,1072,1073],{"class":223,"line":776},[221,1074,343],{"class":242},[221,1076,1077,1079],{"class":223,"line":781},[221,1078,349],{"class":242},[221,1080,352],{"class":238},[1082,1083,1085,1086],"h3",{"id":1084},"when-to-use-next","When to use ",[184,1087,360],{},[1089,1090,1091,1107],"table",{},[1092,1093,1094],"thead",{},[1095,1096,1097,1101],"tr",{},[1098,1099,1100],"th",{},"Use Case",[1098,1102,1103,1104,1106],{},"Need ",[184,1105,360],{},"?",[1108,1109,1110,1119,1126,1134,1141],"tbody",{},[1095,1111,1112,1116],{},[1113,1114,1115],"td",{},"Set context before handler",[1113,1117,1118],{},"No",[1095,1120,1121,1124],{},[1113,1122,1123],{},"Validate auth before handler",[1113,1125,1118],{},[1095,1127,1128,1131],{},[1113,1129,1130],{},"Log request timing",[1113,1132,1133],{},"Yes",[1095,1135,1136,1139],{},[1113,1137,1138],{},"Modify response",[1113,1140,1133],{},[1095,1142,1143,1146],{},[1113,1144,1145],{},"Catch errors",[1113,1147,1133],{},[145,1149,1151],{"id":1150},"authentication-example","Authentication Example",[211,1153,1155],{"className":213,"code":1154,"filename":215,"language":216,"meta":217,"style":217},"import { getHeader, createError } from 'h3'\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,1156,1157,1182,1186,1198,1216,1242,1246,1277,1287,1298,1314,1320,1324,1328,1351,1355,1362,1384,1403,1425,1430,1438,1449,1460,1476,1483,1488,1493],{"__ignoreMap":217},[221,1158,1159,1162,1165,1167,1169,1171,1173,1176,1178,1180],{"class":223,"line":224},[221,1160,1161],{"class":227},"import",[221,1163,1164],{"class":242}," {",[221,1166,425],{"class":238},[221,1168,432],{"class":242},[221,1170,468],{"class":238},[221,1172,499],{"class":242},[221,1174,1175],{"class":227}," from",[221,1177,302],{"class":242},[221,1179,1082],{"class":305},[221,1181,309],{"class":242},[221,1183,1184],{"class":223,"line":246},[221,1185,513],{"emptyLinePlaceholder":512},[221,1187,1188,1190,1192,1194,1196],{"class":223,"line":275},[221,1189,228],{"class":227},[221,1191,231],{"class":227},[221,1193,235],{"class":234},[221,1195,239],{"class":238},[221,1197,243],{"class":242},[221,1199,1200,1202,1204,1206,1208,1210,1212,1214],{"class":223,"line":282},[221,1201,249],{"class":234},[221,1203,252],{"class":242},[221,1205,256],{"class":255},[221,1207,259],{"class":242},[221,1209,263],{"class":262},[221,1211,266],{"class":242},[221,1213,269],{"class":255},[221,1215,272],{"class":242},[221,1217,1218,1220,1223,1225,1227,1229,1231,1233,1235,1238,1240],{"class":223,"line":312},[221,1219,417],{"class":255},[221,1221,1222],{"class":238}," authHeader",[221,1224,299],{"class":242},[221,1226,425],{"class":234},[221,1228,239],{"class":336},[221,1230,263],{"class":238},[221,1232,432],{"class":242},[221,1234,302],{"class":242},[221,1236,1237],{"class":305},"authorization",[221,1239,440],{"class":242},[221,1241,352],{"class":336},[221,1243,1244],{"class":223,"line":340},[221,1245,513],{"emptyLinePlaceholder":512},[221,1247,1248,1250,1252,1254,1257,1260,1263,1265,1267,1270,1272,1275],{"class":223,"line":346},[221,1249,447],{"class":227},[221,1251,259],{"class":336},[221,1253,452],{"class":242},[221,1255,1256],{"class":238},"authHeader",[221,1258,1259],{"class":242},"?.",[221,1261,1262],{"class":234},"startsWith",[221,1264,239],{"class":336},[221,1266,440],{"class":242},[221,1268,1269],{"class":305},"Bearer ",[221,1271,440],{"class":242},[221,1273,1274],{"class":336},")) ",[221,1276,243],{"class":242},[221,1278,1279,1281,1283,1285],{"class":223,"line":509},[221,1280,465],{"class":227},[221,1282,468],{"class":234},[221,1284,239],{"class":336},[221,1286,243],{"class":242},[221,1288,1289,1292,1294,1296],{"class":223,"line":516},[221,1290,1291],{"class":336},"        statusCode",[221,1293,252],{"class":242},[221,1295,482],{"class":481},[221,1297,616],{"class":242},[221,1299,1300,1303,1305,1307,1310,1312],{"class":223,"line":522},[221,1301,1302],{"class":336},"        message",[221,1304,252],{"class":242},[221,1306,302],{"class":242},[221,1308,1309],{"class":305},"Missing or invalid authorization header",[221,1311,440],{"class":242},[221,1313,616],{"class":242},[221,1315,1316,1318],{"class":223,"line":540},[221,1317,768],{"class":242},[221,1319,352],{"class":336},[221,1321,1322],{"class":223,"line":568},[221,1323,506],{"class":242},[221,1325,1326],{"class":223,"line":573},[221,1327,513],{"emptyLinePlaceholder":512},[221,1329,1330,1332,1335,1337,1339,1341,1344,1346,1349],{"class":223,"line":776},[221,1331,417],{"class":255},[221,1333,1334],{"class":238}," token",[221,1336,299],{"class":242},[221,1338,1222],{"class":238},[221,1340,288],{"class":242},[221,1342,1343],{"class":234},"slice",[221,1345,239],{"class":336},[221,1347,1348],{"class":481},"7",[221,1350,352],{"class":336},[221,1352,1353],{"class":223,"line":781},[221,1354,513],{"emptyLinePlaceholder":512},[221,1356,1357,1360],{"class":223,"line":786},[221,1358,1359],{"class":227},"    try",[221,1361,272],{"class":242},[221,1363,1365,1368,1370,1372,1374,1377,1379,1382],{"class":223,"line":1364},17,[221,1366,1367],{"class":255},"      const",[221,1369,679],{"class":238},[221,1371,299],{"class":242},[221,1373,556],{"class":227},[221,1375,1376],{"class":234}," verifyToken",[221,1378,239],{"class":336},[221,1380,1381],{"class":238},"token",[221,1383,352],{"class":336},[221,1385,1387,1390,1392,1394,1396,1398,1400],{"class":223,"line":1386},18,[221,1388,1389],{"class":238},"      event",[221,1391,288],{"class":242},[221,1393,291],{"class":238},[221,1395,288],{"class":242},[221,1397,551],{"class":238},[221,1399,299],{"class":242},[221,1401,1402],{"class":238}," user\n",[221,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422],{"class":223,"line":1405},19,[221,1407,1389],{"class":238},[221,1409,288],{"class":242},[221,1411,291],{"class":238},[221,1413,288],{"class":242},[221,1415,296],{"class":238},[221,1417,299],{"class":242},[221,1419,679],{"class":238},[221,1421,288],{"class":242},[221,1423,1424],{"class":238},"id\n",[221,1426,1428],{"class":223,"line":1427},20,[221,1429,506],{"class":242},[221,1431,1433,1436],{"class":223,"line":1432},21,[221,1434,1435],{"class":227},"    catch",[221,1437,272],{"class":242},[221,1439,1441,1443,1445,1447],{"class":223,"line":1440},22,[221,1442,465],{"class":227},[221,1444,468],{"class":234},[221,1446,239],{"class":336},[221,1448,243],{"class":242},[221,1450,1452,1454,1456,1458],{"class":223,"line":1451},23,[221,1453,1291],{"class":336},[221,1455,252],{"class":242},[221,1457,482],{"class":481},[221,1459,616],{"class":242},[221,1461,1463,1465,1467,1469,1472,1474],{"class":223,"line":1462},24,[221,1464,1302],{"class":336},[221,1466,252],{"class":242},[221,1468,302],{"class":242},[221,1470,1471],{"class":305},"Invalid token",[221,1473,440],{"class":242},[221,1475,616],{"class":242},[221,1477,1479,1481],{"class":223,"line":1478},25,[221,1480,768],{"class":242},[221,1482,352],{"class":336},[221,1484,1486],{"class":223,"line":1485},26,[221,1487,506],{"class":242},[221,1489,1491],{"class":223,"line":1490},27,[221,1492,343],{"class":242},[221,1494,1496,1498],{"class":223,"line":1495},28,[221,1497,349],{"class":242},[221,1499,352],{"class":238},[145,1501,1503],{"id":1502},"logging-analytics-example","Logging & Analytics Example",[211,1505,1507],{"className":213,"code":1506,"filename":215,"language":216,"meta":217,"style":217},"export 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,1508,1509,1521,1543,1562,1578,1582,1600,1604,1626,1642,1649,1664,1680,1704,1712,1716,1730,1734,1754,1769,1775,1796,1816,1822,1826,1832,1836],{"__ignoreMap":217},[221,1510,1511,1513,1515,1517,1519],{"class":223,"line":224},[221,1512,228],{"class":227},[221,1514,231],{"class":227},[221,1516,235],{"class":234},[221,1518,239],{"class":238},[221,1520,243],{"class":242},[221,1522,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541],{"class":223,"line":246},[221,1524,249],{"class":234},[221,1526,252],{"class":242},[221,1528,256],{"class":255},[221,1530,259],{"class":242},[221,1532,263],{"class":262},[221,1534,432],{"class":242},[221,1536,920],{"class":262},[221,1538,266],{"class":242},[221,1540,269],{"class":255},[221,1542,272],{"class":242},[221,1544,1545,1547,1550,1552,1555,1557,1560],{"class":223,"line":275},[221,1546,417],{"class":255},[221,1548,1549],{"class":238}," requestId",[221,1551,299],{"class":242},[221,1553,1554],{"class":238}," crypto",[221,1556,288],{"class":242},[221,1558,1559],{"class":234},"randomUUID",[221,1561,337],{"class":336},[221,1563,1564,1566,1568,1570,1572,1574,1576],{"class":223,"line":282},[221,1565,417],{"class":255},[221,1567,933],{"class":238},[221,1569,299],{"class":242},[221,1571,328],{"class":238},[221,1573,288],{"class":242},[221,1575,333],{"class":234},[221,1577,337],{"class":336},[221,1579,1580],{"class":223,"line":312},[221,1581,513],{"emptyLinePlaceholder":512},[221,1583,1584,1586,1588,1590,1592,1595,1597],{"class":223,"line":340},[221,1585,285],{"class":238},[221,1587,288],{"class":242},[221,1589,291],{"class":238},[221,1591,288],{"class":242},[221,1593,1594],{"class":238},"requestId",[221,1596,299],{"class":242},[221,1598,1599],{"class":238}," requestId\n",[221,1601,1602],{"class":223,"line":346},[221,1603,513],{"emptyLinePlaceholder":512},[221,1605,1606,1608,1610,1612,1614,1617,1619,1622,1624],{"class":223,"line":509},[221,1607,948],{"class":238},[221,1609,288],{"class":242},[221,1611,953],{"class":234},[221,1613,239],{"class":336},[221,1615,1616],{"class":238},"JSON",[221,1618,288],{"class":242},[221,1620,1621],{"class":234},"stringify",[221,1623,239],{"class":336},[221,1625,243],{"class":242},[221,1627,1628,1631,1633,1635,1638,1640],{"class":223,"line":516},[221,1629,1630],{"class":336},"      type",[221,1632,252],{"class":242},[221,1634,302],{"class":242},[221,1636,1637],{"class":305},"mcp_request_start",[221,1639,440],{"class":242},[221,1641,616],{"class":242},[221,1643,1644,1647],{"class":223,"line":522},[221,1645,1646],{"class":238},"      requestId",[221,1648,616],{"class":242},[221,1650,1651,1654,1656,1658,1660,1662],{"class":223,"line":540},[221,1652,1653],{"class":336},"      path",[221,1655,252],{"class":242},[221,1657,665],{"class":238},[221,1659,288],{"class":242},[221,1661,971],{"class":238},[221,1663,616],{"class":242},[221,1665,1666,1669,1671,1673,1675,1678],{"class":223,"line":568},[221,1667,1668],{"class":336},"      method",[221,1670,252],{"class":242},[221,1672,665],{"class":238},[221,1674,288],{"class":242},[221,1676,1677],{"class":238},"method",[221,1679,616],{"class":242},[221,1681,1682,1685,1687,1690,1692,1695,1697,1700,1702],{"class":223,"line":573},[221,1683,1684],{"class":336},"      timestamp",[221,1686,252],{"class":242},[221,1688,1689],{"class":242}," new",[221,1691,328],{"class":234},[221,1693,1694],{"class":336},"()",[221,1696,288],{"class":242},[221,1698,1699],{"class":234},"toISOString",[221,1701,1694],{"class":336},[221,1703,616],{"class":242},[221,1705,1706,1709],{"class":223,"line":776},[221,1707,1708],{"class":242},"    }",[221,1710,1711],{"class":336},"))\n",[221,1713,1714],{"class":223,"line":781},[221,1715,513],{"emptyLinePlaceholder":512},[221,1717,1718,1720,1722,1724,1726,1728],{"class":223,"line":786},[221,1719,417],{"class":255},[221,1721,989],{"class":238},[221,1723,299],{"class":242},[221,1725,556],{"class":227},[221,1727,920],{"class":234},[221,1729,337],{"class":336},[221,1731,1732],{"class":223,"line":1364},[221,1733,513],{"emptyLinePlaceholder":512},[221,1735,1736,1738,1740,1742,1744,1746,1748,1750,1752],{"class":223,"line":1386},[221,1737,948],{"class":238},[221,1739,288],{"class":242},[221,1741,953],{"class":234},[221,1743,239],{"class":336},[221,1745,1616],{"class":238},[221,1747,288],{"class":242},[221,1749,1621],{"class":234},[221,1751,239],{"class":336},[221,1753,243],{"class":242},[221,1755,1756,1758,1760,1762,1765,1767],{"class":223,"line":1405},[221,1757,1630],{"class":336},[221,1759,252],{"class":242},[221,1761,302],{"class":242},[221,1763,1764],{"class":305},"mcp_request_end",[221,1766,440],{"class":242},[221,1768,616],{"class":242},[221,1770,1771,1773],{"class":223,"line":1427},[221,1772,1646],{"class":238},[221,1774,616],{"class":242},[221,1776,1777,1780,1782,1784,1786,1788,1790,1792,1794],{"class":223,"line":1432},[221,1778,1779],{"class":336},"      duration",[221,1781,252],{"class":242},[221,1783,328],{"class":238},[221,1785,288],{"class":242},[221,1787,333],{"class":234},[221,1789,1024],{"class":336},[221,1791,1027],{"class":242},[221,1793,933],{"class":238},[221,1795,616],{"class":242},[221,1797,1798,1800,1802,1804,1806,1808,1810,1812,1814],{"class":223,"line":1440},[221,1799,1684],{"class":336},[221,1801,252],{"class":242},[221,1803,1689],{"class":242},[221,1805,328],{"class":234},[221,1807,1694],{"class":336},[221,1809,288],{"class":242},[221,1811,1699],{"class":234},[221,1813,1694],{"class":336},[221,1815,616],{"class":242},[221,1817,1818,1820],{"class":223,"line":1451},[221,1819,1708],{"class":242},[221,1821,1711],{"class":336},[221,1823,1824],{"class":223,"line":1462},[221,1825,513],{"emptyLinePlaceholder":512},[221,1827,1828,1830],{"class":223,"line":1478},[221,1829,701],{"class":227},[221,1831,1070],{"class":238},[221,1833,1834],{"class":223,"line":1485},[221,1835,343],{"class":242},[221,1837,1838,1840],{"class":223,"line":1490},[221,1839,349],{"class":242},[221,1841,352],{"class":238},[145,1843,1845],{"id":1844},"middleware-with-custom-handlers","Middleware with Custom Handlers",[150,1847,1848],{},"Middleware works the same way with custom handlers:",[211,1850,1853],{"className":213,"code":1851,"filename":1852,"language":216,"meta":217,"style":217},"export 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,1854,1855,1867,1882,1900,1919,1923,1949,1959,1970,1985,1991,1995,1999,2015,2019,2036],{"__ignoreMap":217},[221,1856,1857,1859,1861,1863,1865],{"class":223,"line":224},[221,1858,228],{"class":227},[221,1860,231],{"class":227},[221,1862,235],{"class":234},[221,1864,239],{"class":238},[221,1866,243],{"class":242},[221,1868,1869,1871,1873,1875,1878,1880],{"class":223,"line":246},[221,1870,604],{"class":336},[221,1872,252],{"class":242},[221,1874,302],{"class":242},[221,1876,1877],{"class":305},"admin",[221,1879,440],{"class":242},[221,1881,616],{"class":242},[221,1883,1884,1886,1888,1890,1892,1894,1896,1898],{"class":223,"line":275},[221,1885,249],{"class":234},[221,1887,252],{"class":242},[221,1889,256],{"class":255},[221,1891,259],{"class":242},[221,1893,263],{"class":262},[221,1895,266],{"class":242},[221,1897,269],{"class":255},[221,1899,272],{"class":242},[221,1901,1902,1904,1906,1908,1910,1913,1915,1917],{"class":223,"line":282},[221,1903,417],{"class":255},[221,1905,679],{"class":238},[221,1907,299],{"class":242},[221,1909,556],{"class":227},[221,1911,1912],{"class":234}," getUser",[221,1914,239],{"class":336},[221,1916,263],{"class":238},[221,1918,352],{"class":336},[221,1920,1921],{"class":223,"line":312},[221,1922,513],{"emptyLinePlaceholder":512},[221,1924,1925,1927,1929,1931,1933,1936,1939,1941,1943,1945,1947],{"class":223,"line":340},[221,1926,447],{"class":227},[221,1928,259],{"class":336},[221,1930,551],{"class":238},[221,1932,1259],{"class":242},[221,1934,1935],{"class":238},"role",[221,1937,1938],{"class":242}," !==",[221,1940,302],{"class":242},[221,1942,1877],{"class":305},[221,1944,440],{"class":242},[221,1946,458],{"class":336},[221,1948,243],{"class":242},[221,1950,1951,1953,1955,1957],{"class":223,"line":346},[221,1952,465],{"class":227},[221,1954,468],{"class":234},[221,1956,239],{"class":336},[221,1958,243],{"class":242},[221,1960,1961,1963,1965,1968],{"class":223,"line":509},[221,1962,1291],{"class":336},[221,1964,252],{"class":242},[221,1966,1967],{"class":481}," 403",[221,1969,616],{"class":242},[221,1971,1972,1974,1976,1978,1981,1983],{"class":223,"line":516},[221,1973,1302],{"class":336},[221,1975,252],{"class":242},[221,1977,302],{"class":242},[221,1979,1980],{"class":305},"Admin access required",[221,1982,440],{"class":242},[221,1984,616],{"class":242},[221,1986,1987,1989],{"class":223,"line":522},[221,1988,768],{"class":242},[221,1990,352],{"class":336},[221,1992,1993],{"class":223,"line":540},[221,1994,506],{"class":242},[221,1996,1997],{"class":223,"line":568},[221,1998,513],{"emptyLinePlaceholder":512},[221,2000,2001,2003,2005,2007,2009,2011,2013],{"class":223,"line":573},[221,2002,285],{"class":238},[221,2004,288],{"class":242},[221,2006,291],{"class":238},[221,2008,288],{"class":242},[221,2010,551],{"class":238},[221,2012,299],{"class":242},[221,2014,1402],{"class":238},[221,2016,2017],{"class":223,"line":776},[221,2018,343],{"class":242},[221,2020,2021,2024,2026,2029,2031,2034],{"class":223,"line":781},[221,2022,2023],{"class":336},"  tools",[221,2025,252],{"class":242},[221,2027,2028],{"class":238}," [adminTool1",[221,2030,432],{"class":242},[221,2032,2033],{"class":238}," adminTool2]",[221,2035,616],{"class":242},[221,2037,2038,2040],{"class":223,"line":786},[221,2039,349],{"class":242},[221,2041,352],{"class":238},[145,2043,81],{"id":216},[150,2045,2046],{},"For type-safe context, extend the H3 context:",[211,2048,2051],{"className":213,"code":2049,"filename":2050,"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,2052,2053,2069,2080,2090,2100,2109,2131,2135,2144,2154,2159],{"__ignoreMap":217},[221,2054,2055,2058,2061,2063,2065,2067],{"class":223,"line":224},[221,2056,2057],{"class":255},"declare",[221,2059,2060],{"class":255}," module",[221,2062,302],{"class":242},[221,2064,1082],{"class":305},[221,2066,440],{"class":242},[221,2068,272],{"class":242},[221,2070,2071,2074,2078],{"class":223,"line":246},[221,2072,2073],{"class":255},"  interface",[221,2075,2077],{"class":2076},"sBMFI"," H3EventContext",[221,2079,272],{"class":242},[221,2081,2082,2085,2088],{"class":223,"line":275},[221,2083,2084],{"class":336},"    user",[221,2086,2087],{"class":242},"?:",[221,2089,272],{"class":242},[221,2091,2092,2095,2097],{"class":223,"line":282},[221,2093,2094],{"class":336},"      id",[221,2096,252],{"class":242},[221,2098,2099],{"class":2076}," string\n",[221,2101,2102,2105,2107],{"class":223,"line":312},[221,2103,2104],{"class":336},"      name",[221,2106,252],{"class":242},[221,2108,2099],{"class":2076},[221,2110,2111,2114,2116,2118,2120,2122,2125,2127,2129],{"class":223,"line":340},[221,2112,2113],{"class":336},"      role",[221,2115,252],{"class":242},[221,2117,302],{"class":242},[221,2119,551],{"class":305},[221,2121,440],{"class":242},[221,2123,2124],{"class":242}," |",[221,2126,302],{"class":242},[221,2128,1877],{"class":305},[221,2130,309],{"class":242},[221,2132,2133],{"class":223,"line":346},[221,2134,506],{"class":242},[221,2136,2137,2140,2142],{"class":223,"line":509},[221,2138,2139],{"class":336},"    requestId",[221,2141,2087],{"class":242},[221,2143,2099],{"class":2076},[221,2145,2146,2149,2151],{"class":223,"line":516},[221,2147,2148],{"class":336},"    startTime",[221,2150,2087],{"class":242},[221,2152,2153],{"class":2076}," number\n",[221,2155,2156],{"class":223,"line":522},[221,2157,2158],{"class":242},"  }\n",[221,2160,2161],{"class":223,"line":540},[221,2162,2163],{"class":242},"}\n",[150,2165,2166],{},"Now your middleware and tools will have typed context:",[211,2168,2170],{"className":213,"code":2169,"filename":215,"language":216,"meta":217,"style":217},"export 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,2171,2172,2184,2202,2218,2232,2247,2264,2268,2272],{"__ignoreMap":217},[221,2173,2174,2176,2178,2180,2182],{"class":223,"line":224},[221,2175,228],{"class":227},[221,2177,231],{"class":227},[221,2179,235],{"class":234},[221,2181,239],{"class":238},[221,2183,243],{"class":242},[221,2185,2186,2188,2190,2192,2194,2196,2198,2200],{"class":223,"line":246},[221,2187,249],{"class":234},[221,2189,252],{"class":242},[221,2191,256],{"class":255},[221,2193,259],{"class":242},[221,2195,263],{"class":262},[221,2197,266],{"class":242},[221,2199,269],{"class":255},[221,2201,272],{"class":242},[221,2203,2204,2206,2208,2210,2212,2214,2216],{"class":223,"line":275},[221,2205,285],{"class":238},[221,2207,288],{"class":242},[221,2209,291],{"class":238},[221,2211,288],{"class":242},[221,2213,551],{"class":238},[221,2215,299],{"class":242},[221,2217,272],{"class":242},[221,2219,2220,2222,2224,2226,2228,2230],{"class":223,"line":282},[221,2221,2094],{"class":336},[221,2223,252],{"class":242},[221,2225,302],{"class":242},[221,2227,306],{"class":305},[221,2229,440],{"class":242},[221,2231,616],{"class":242},[221,2233,2234,2236,2238,2240,2243,2245],{"class":223,"line":312},[221,2235,2104],{"class":336},[221,2237,252],{"class":242},[221,2239,302],{"class":242},[221,2241,2242],{"class":305},"John",[221,2244,440],{"class":242},[221,2246,616],{"class":242},[221,2248,2249,2251,2253,2255,2257,2259,2261],{"class":223,"line":340},[221,2250,2113],{"class":336},[221,2252,252],{"class":242},[221,2254,302],{"class":242},[221,2256,1877],{"class":305},[221,2258,440],{"class":242},[221,2260,432],{"class":242},[221,2262,2263],{"class":278}," \u002F\u002F TypeScript will validate this\n",[221,2265,2266],{"class":223,"line":346},[221,2267,506],{"class":242},[221,2269,2270],{"class":223,"line":509},[221,2271,343],{"class":242},[221,2273,2274,2276],{"class":223,"line":516},[221,2275,349],{"class":242},[221,2277,352],{"class":238},[145,2279,2281],{"id":2280},"best-practices","Best Practices",[2283,2284,2285,2291,2300,2312,2322],"ol",{},[166,2286,2287,2290],{},[154,2288,2289],{},"Keep middleware focused"," - Do one thing well",[166,2292,2293,2299],{},[154,2294,2295,2296,2298],{},"Don't call ",[184,2297,360],{}," if you don't need it"," - Let it be called automatically",[166,2301,2302,2308,2309,2311],{},[154,2303,2304,2305,2307],{},"Always return ",[184,2306,360],{}," result"," - If you call ",[184,2310,360],{},", return its result",[166,2313,2314,2317,2318,2321],{},[154,2315,2316],{},"Handle errors gracefully"," - Use ",[184,2319,2320],{},"createError"," for HTTP errors",[166,2323,2324,2327],{},[154,2325,2326],{},"Type your context"," - Extend H3EventContext for type safety",[145,2329,2331],{"id":2330},"next-steps","Next Steps",[163,2333,2334,2340,2345],{},[166,2335,2336,2339],{},[2337,2338,61],"a",{"href":62}," - Learn about custom handlers",[166,2341,2342,2344],{},[2337,2343,81],{"href":82}," - Type-safe definitions",[166,2346,2347,2349],{},[2337,2348,46],{"href":47}," - Create tools that use middleware context",[2351,2352,2353],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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":246,"depth":246,"links":2355},[2356,2357,2358,2359,2364,2365,2366,2367,2368,2369],{"id":147,"depth":246,"text":148},{"id":201,"depth":246,"text":202},{"id":368,"depth":246,"text":369},{"id":873,"depth":246,"text":2360,"children":2361},"Advanced Middleware with next()",[2362],{"id":1084,"depth":275,"text":2363},"When to use next()",{"id":1150,"depth":246,"text":1151},{"id":1502,"depth":246,"text":1503},{"id":1844,"depth":246,"text":1845},{"id":216,"depth":246,"text":81},{"id":2280,"depth":246,"text":2281},{"id":2330,"depth":246,"text":2331},"Intercept MCP requests to add authentication, logging, analytics, and more.","md",null,{},{"icon":79},{"title":2376,"description":2377},"MCP Middleware","Add middleware to your MCP handlers for authentication, logging, and request interception.","qYRdTYTH0nkFjj9eGRN67K5aw_vY5mDoWefuTSh0Fu4",[2380,2382],{"title":71,"path":72,"stem":73,"description":2381,"icon":74,"children":-1},"Customize where the module looks for MCP definitions.",{"title":81,"path":82,"stem":83,"description":2383,"icon":84,"children":-1},"Type safety and TypeScript features in the Nuxt MCP module.",1773932610219]