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