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