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