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