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