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