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