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