[{"data":1,"prerenderedAt":4039},["ShallowReactive",2],{"versions":3,"plugin-litestar-mcp":6,"readme-litestar-mcp":49},{"v3":4,"v4":5},"3.21.10","4.5.1",{"id":7,"title":8,"body":9,"category":10,"changelog":11,"compatibility":12,"created_at":14,"description":15,"documentation":16,"extension":17,"github":18,"icon":19,"issues":20,"key":21,"latest_version":22,"license":9,"maintainers":23,"meta":28,"monthly_downloads":29,"name":30,"navigation":31,"path":32,"pypi":21,"python_compatibility":33,"python_compatibility_raw":34,"repo":41,"seo":42,"sponsor":43,"stars":44,"stem":45,"type":46,"updated_at":47,"website":16,"__hash__":48},"plugins\u002Fplugins\u002Flitestar-mcp.yml","Litestar Mcp",null,"AI","https:\u002F\u002Fcofin.github.io\u002Flitestar-mcp\u002Flatest\u002Fchangelog",{"litestar":13},">=2.23.0","2025-09-06T19:14:18","Litestar plugin for Model Context Protocol (MCP) integration","https:\u002F\u002Fcofin.github.io\u002Flitestar-mcp\u002Flatest\u002F","yml","https:\u002F\u002Fgithub.com\u002Fcofin\u002Flitestar-mcp","litestar-mcp.svg","https:\u002F\u002Fgithub.com\u002Fcofin\u002Flitestar-mcp\u002Fissues\u002F","litestar-mcp","0.11.1",[24],{"name":25,"github":26,"avatar":27},"Cody Fincher","cofin","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F204685?v=4",{},12674,"Litestar MCP",true,"\u002Fplugins\u002Flitestar-mcp",{"raw":34,"specifier_set":34,"compatible":35},">=3.10",[36,37,38,39,40],"3.10","3.11","3.12","3.13","3.14","cofin\u002Flitestar-mcp",{"description":15},false,12,"plugins\u002Flitestar-mcp","official","2026-07-06T14:54:42","qLyRwsY91YRVtnxd2F7badMI3b_2wx77rRdNnEt76dA",{"id":50,"extension":51,"meta":52,"stem":4037,"__hash__":4038},"readme\u002Freadmes\u002Flitestar-mcp.md","md",{"body":53},{"type":54,"value":55,"toc":4009},"minimark",[56,60,88,93,129,133,256,260,265,308,312,883,887,894,1108,1140,1144,1319,1323,1330,1356,1361,1572,1578,1604,1608,1838,1842,1882,1886,1889,1938,1943,1954,1958,1964,1993,1998,2282,2286,3352,3356,3370,3374,3381,3491,3498,3502,3507,3778,3789,3793,3802,3891,3895,3984,3987,3994,3998,4005],[57,58,59],"p",{},"A lightweight plugin that integrates Litestar web applications with the Model Context Protocol (MCP) by exposing marked routes as MCP tools, resources, and prompts over MCP Streamable HTTP and JSON-RPC.",[57,61,62,73,80],{},[63,64,68],"a",{"href":65,"rel":66},"https:\u002F\u002Fpypi.org\u002Fproject\u002Flitestar-mcp\u002F",[67],"nofollow",[69,70],"img",{"alt":71,"src":72},"PyPI - Version","https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Flitestar-mcp",[63,74,76],{"href":65,"rel":75},[67],[69,77],{"alt":78,"src":79},"Python Version","https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fpyversions\u002Flitestar-mcp",[63,81,84],{"href":82,"rel":83},"https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT",[67],[69,85],{"alt":86,"src":87},"License","https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg",[89,90,92],"h2",{"id":91},"overview","Overview",[57,94,95,96,100,101,104,105,108,109,112,113,116,117,120,121,124,125,128],{},"This plugin automatically discovers Litestar routes marked for MCP and exposes them through an MCP-native transport surface. Pass ",[97,98,99],"code",{},"mcp_tool=\"name\"",", ",[97,102,103],{},"mcp_resource=\"name\"",", or ",[97,106,107],{},"mcp_prompt=\"name\""," straight through to ",[97,110,111],{},"@get"," \u002F ",[97,114,115],{},"@post"," \u002F etc. — Litestar funnels unknown kwargs into ",[97,118,119],{},"handler.opt",", so no second decorator or ",[97,122,123],{},"opt={...}"," wrapper is needed. Standalone prompt callables that are not bound to an HTTP route can be registered through ",[97,126,127],{},"LitestarMCP(prompts=[...])",".",[89,130,132],{"id":131},"features","Features",[134,135,136,144,163,181,191,210,220,226,232,250],"ul",{},[137,138,139,143],"li",{},[140,141,142],"strong",{},"Protocol-Native Transport"," — MCP Streamable HTTP with JSON-RPC requests and SSE streams.",[137,145,146,149,150,154,155,158,159,162],{},[140,147,148],{},"Three MCP Primitives"," — tools, resources, ",[151,152,153],"em",{},"and"," prompts, with ",[97,156,157],{},"prompts\u002Flist"," and ",[97,160,161],{},"prompts\u002Fget"," driven by the same handler discovery as the rest of the surface.",[137,164,165,168,169,112,172,112,175,178,179,128],{},[140,166,167],{},"Simple Route Marking"," — pass ",[97,170,171],{},"mcp_tool",[97,173,174],{},"mcp_resource",[97,176,177],{},"mcp_prompt"," kwargs straight through to Litestar's route decorators, or register standalone prompts via ",[97,180,127],{},[137,182,183,186,187,190],{},[140,184,185],{},"RFC 6570 URI Templates"," — ",[97,188,189],{},"mcp_resource_template=\"app:\u002F\u002F…\u002F{var}\""," dispatches concrete URIs to handlers with extracted vars.",[137,192,193,196,197,100,200,100,203,100,206,209],{},[140,194,195],{},"First-Class Descriptions"," — structured ",[97,198,199],{},"mcp_description",[97,201,202],{},"mcp_agent_instructions",[97,204,205],{},"mcp_when_to_use",[97,207,208],{},"mcp_returns"," kwargs.",[137,211,212,215,216,219],{},[140,213,214],{},"Type Safe"," — full type hints with dataclasses; ",[97,217,218],{},"msgspec","-powered tool-argument validation.",[137,221,222,225],{},[140,223,224],{},"Automatic Discovery"," — routes are discovered at app initialization.",[137,227,228,231],{},[140,229,230],{},"OpenAPI Integration"," — server info derived from OpenAPI config.",[137,233,234,237,238,241,242,245,246,249],{},[140,235,236],{},"OIDC Auth Baked In"," — bearer-token validation via ",[97,239,240],{},"MCPAuthBackend"," or a composable ",[97,243,244],{},"create_oidc_validator()"," factory; injectable ",[97,247,248],{},"JWKSCache"," protocol for shared document caches.",[137,251,252,255],{},[140,253,254],{},"Optional Task Support"," — experimental in-memory MCP task lifecycle endpoints.",[89,257,259],{"id":258},"quick-start","Quick Start",[261,262,264],"h3",{"id":263},"installation","Installation",[266,267,272],"pre",{"className":268,"code":269,"language":270,"meta":271,"style":271},"language-bash shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","pip install litestar-mcp\n# or\nuv add litestar-mcp\n","bash","",[97,273,274,290,297],{"__ignoreMap":271},[275,276,279,283,287],"span",{"class":277,"line":278},"line",1,[275,280,282],{"class":281},"s52Pk","pip",[275,284,286],{"class":285},"sGFVr"," install",[275,288,289],{"class":285}," litestar-mcp\n",[275,291,293],{"class":277,"line":292},2,[275,294,296],{"class":295},"sWuyu","# or\n",[275,298,300,303,306],{"class":277,"line":299},3,[275,301,302],{"class":281},"uv",[275,304,305],{"class":285}," add",[275,307,289],{"class":285},[261,309,311],{"id":310},"basic-usage","Basic Usage",[266,313,317],{"className":314,"code":315,"language":316,"meta":271,"style":271},"language-python shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","from litestar import Litestar, get, post\nfrom litestar.openapi.config import OpenAPIConfig\nfrom litestar_mcp import LitestarMCP\n\n# Mark routes for MCP exposure using the opt attribute\n@get(\"\u002Fusers\", mcp_tool=\"list_users\")\nasync def get_users() -> list[dict]:\n    \"\"\"List all users in the system.\"\"\"\n    return [{\"id\": 1, \"name\": \"Alice\"}, {\"id\": 2, \"name\": \"Bob\"}]\n\n@post(\"\u002Fanalyze\", mcp_tool=\"analyze_data\")\nasync def analyze_data(data: dict) -> dict:\n    \"\"\"Analyze the provided data and return insights.\"\"\"\n    return {\"result\": f\"Analyzed {len(data)} items\"}\n\n@get(\"\u002Fconfig\", mcp_resource=\"app_config\")\nasync def get_app_config() -> dict:\n    \"\"\"Get the current application configuration.\"\"\"\n    return {\"debug\": True, \"version\": \"1.0.0\"}\n\n# Add the MCP plugin to your Litestar app\napp = Litestar(\n    route_handlers=[get_users, analyze_data, get_app_config],\n    plugins=[LitestarMCP()],\n    openapi_config=OpenAPIConfig(title=\"My API\", version=\"1.0.0\"),\n)\n","python",[97,318,319,347,369,381,387,393,433,464,476,555,560,592,621,631,674,679,711,729,739,776,781,787,800,823,837,878],{"__ignoreMap":271},[275,320,321,325,329,332,335,339,342,344],{"class":277,"line":278},[275,322,324],{"class":323},"s8R28","from",[275,326,328],{"class":327},"sZSNi"," litestar ",[275,330,331],{"class":323},"import",[275,333,334],{"class":327}," Litestar",[275,336,338],{"class":337},"sDfIl",",",[275,340,341],{"class":327}," get",[275,343,338],{"class":337},[275,345,346],{"class":327}," post\n",[275,348,349,351,354,356,359,361,364,366],{"class":277,"line":292},[275,350,324],{"class":323},[275,352,353],{"class":327}," litestar",[275,355,128],{"class":337},[275,357,358],{"class":327},"openapi",[275,360,128],{"class":337},[275,362,363],{"class":327},"config ",[275,365,331],{"class":323},[275,367,368],{"class":327}," OpenAPIConfig\n",[275,370,371,373,376,378],{"class":277,"line":299},[275,372,324],{"class":323},[275,374,375],{"class":327}," litestar_mcp ",[275,377,331],{"class":323},[275,379,380],{"class":327}," LitestarMCP\n",[275,382,384],{"class":277,"line":383},4,[275,385,386],{"emptyLinePlaceholder":31},"\n",[275,388,390],{"class":277,"line":389},5,[275,391,392],{"class":295},"# Mark routes for MCP exposure using the opt attribute\n",[275,394,396,399,403,406,409,412,414,416,420,423,425,428,430],{"class":277,"line":395},6,[275,397,398],{"class":337},"@",[275,400,402],{"class":401},"s3cPz","get",[275,404,405],{"class":337},"(",[275,407,408],{"class":337},"\"",[275,410,411],{"class":285},"\u002Fusers",[275,413,408],{"class":337},[275,415,338],{"class":337},[275,417,419],{"class":418},"s1nJG"," mcp_tool",[275,421,422],{"class":337},"=",[275,424,408],{"class":337},[275,426,427],{"class":285},"list_users",[275,429,408],{"class":337},[275,431,432],{"class":337},")\n",[275,434,436,440,443,446,449,452,455,458,461],{"class":277,"line":435},7,[275,437,439],{"class":438},"smZ93","async",[275,441,442],{"class":438}," def",[275,444,445],{"class":401}," get_users",[275,447,448],{"class":337},"()",[275,450,451],{"class":337}," ->",[275,453,454],{"class":327}," list",[275,456,457],{"class":337},"[",[275,459,460],{"class":281},"dict",[275,462,463],{"class":337},"]:\n",[275,465,467,470,473],{"class":277,"line":466},8,[275,468,469],{"class":323},"    \"\"\"",[275,471,472],{"class":295},"List all users in the system.",[275,474,475],{"class":323},"\"\"\"\n",[275,477,479,482,485,487,490,492,495,499,501,504,507,509,511,513,516,518,521,524,526,528,530,532,535,537,539,541,543,545,547,550,552],{"class":277,"line":478},9,[275,480,481],{"class":323},"    return",[275,483,484],{"class":337}," [{",[275,486,408],{"class":337},[275,488,489],{"class":285},"id",[275,491,408],{"class":337},[275,493,494],{"class":337},":",[275,496,498],{"class":497},"sYRBq"," 1",[275,500,338],{"class":337},[275,502,503],{"class":337}," \"",[275,505,506],{"class":285},"name",[275,508,408],{"class":337},[275,510,494],{"class":337},[275,512,503],{"class":337},[275,514,515],{"class":285},"Alice",[275,517,408],{"class":337},[275,519,520],{"class":337},"},",[275,522,523],{"class":337}," {",[275,525,408],{"class":337},[275,527,489],{"class":285},[275,529,408],{"class":337},[275,531,494],{"class":337},[275,533,534],{"class":497}," 2",[275,536,338],{"class":337},[275,538,503],{"class":337},[275,540,506],{"class":285},[275,542,408],{"class":337},[275,544,494],{"class":337},[275,546,503],{"class":337},[275,548,549],{"class":285},"Bob",[275,551,408],{"class":337},[275,553,554],{"class":337},"}]\n",[275,556,558],{"class":277,"line":557},10,[275,559,386],{"emptyLinePlaceholder":31},[275,561,563,565,568,570,572,575,577,579,581,583,585,588,590],{"class":277,"line":562},11,[275,564,398],{"class":337},[275,566,567],{"class":401},"post",[275,569,405],{"class":337},[275,571,408],{"class":337},[275,573,574],{"class":285},"\u002Fanalyze",[275,576,408],{"class":337},[275,578,338],{"class":337},[275,580,419],{"class":418},[275,582,422],{"class":337},[275,584,408],{"class":337},[275,586,587],{"class":285},"analyze_data",[275,589,408],{"class":337},[275,591,432],{"class":337},[275,593,594,596,598,601,603,606,608,611,614,616,618],{"class":277,"line":44},[275,595,439],{"class":438},[275,597,442],{"class":438},[275,599,600],{"class":401}," analyze_data",[275,602,405],{"class":337},[275,604,605],{"class":418},"data",[275,607,494],{"class":337},[275,609,610],{"class":281}," dict",[275,612,613],{"class":337},")",[275,615,451],{"class":337},[275,617,610],{"class":281},[275,619,620],{"class":337},":\n",[275,622,624,626,629],{"class":277,"line":623},13,[275,625,469],{"class":323},[275,627,628],{"class":295},"Analyze the provided data and return insights.",[275,630,475],{"class":323},[275,632,634,636,638,640,643,645,647,650,653,656,659,661,663,665,668,671],{"class":277,"line":633},14,[275,635,481],{"class":323},[275,637,523],{"class":337},[275,639,408],{"class":337},[275,641,642],{"class":285},"result",[275,644,408],{"class":337},[275,646,494],{"class":337},[275,648,649],{"class":438}," f",[275,651,652],{"class":285},"\"Analyzed ",[275,654,655],{"class":497},"{",[275,657,658],{"class":401},"len",[275,660,405],{"class":337},[275,662,605],{"class":401},[275,664,613],{"class":337},[275,666,667],{"class":497},"}",[275,669,670],{"class":285}," items\"",[275,672,673],{"class":337},"}\n",[275,675,677],{"class":277,"line":676},15,[275,678,386],{"emptyLinePlaceholder":31},[275,680,682,684,686,688,690,693,695,697,700,702,704,707,709],{"class":277,"line":681},16,[275,683,398],{"class":337},[275,685,402],{"class":401},[275,687,405],{"class":337},[275,689,408],{"class":337},[275,691,692],{"class":285},"\u002Fconfig",[275,694,408],{"class":337},[275,696,338],{"class":337},[275,698,699],{"class":418}," mcp_resource",[275,701,422],{"class":337},[275,703,408],{"class":337},[275,705,706],{"class":285},"app_config",[275,708,408],{"class":337},[275,710,432],{"class":337},[275,712,714,716,718,721,723,725,727],{"class":277,"line":713},17,[275,715,439],{"class":438},[275,717,442],{"class":438},[275,719,720],{"class":401}," get_app_config",[275,722,448],{"class":337},[275,724,451],{"class":337},[275,726,610],{"class":281},[275,728,620],{"class":337},[275,730,732,734,737],{"class":277,"line":731},18,[275,733,469],{"class":323},[275,735,736],{"class":295},"Get the current application configuration.",[275,738,475],{"class":323},[275,740,742,744,746,748,751,753,755,758,760,763,765,767,769,772,774],{"class":277,"line":741},19,[275,743,481],{"class":323},[275,745,523],{"class":337},[275,747,408],{"class":337},[275,749,750],{"class":285},"debug",[275,752,408],{"class":337},[275,754,494],{"class":337},[275,756,757],{"class":337}," True,",[275,759,503],{"class":337},[275,761,762],{"class":285},"version",[275,764,408],{"class":337},[275,766,494],{"class":337},[275,768,503],{"class":337},[275,770,771],{"class":285},"1.0.0",[275,773,408],{"class":337},[275,775,673],{"class":337},[275,777,779],{"class":277,"line":778},20,[275,780,386],{"emptyLinePlaceholder":31},[275,782,784],{"class":277,"line":783},21,[275,785,786],{"class":295},"# Add the MCP plugin to your Litestar app\n",[275,788,790,793,795,797],{"class":277,"line":789},22,[275,791,792],{"class":327},"app ",[275,794,422],{"class":337},[275,796,334],{"class":401},[275,798,799],{"class":337},"(\n",[275,801,803,806,809,812,814,816,818,820],{"class":277,"line":802},23,[275,804,805],{"class":418},"    route_handlers",[275,807,808],{"class":337},"=[",[275,810,811],{"class":401},"get_users",[275,813,338],{"class":337},[275,815,600],{"class":401},[275,817,338],{"class":337},[275,819,720],{"class":401},[275,821,822],{"class":337},"],\n",[275,824,826,829,831,834],{"class":277,"line":825},24,[275,827,828],{"class":418},"    plugins",[275,830,808],{"class":337},[275,832,833],{"class":401},"LitestarMCP",[275,835,836],{"class":337},"()],\n",[275,838,840,843,845,848,850,853,855,857,860,862,864,867,869,871,873,875],{"class":277,"line":839},25,[275,841,842],{"class":418},"    openapi_config",[275,844,422],{"class":337},[275,846,847],{"class":401},"OpenAPIConfig",[275,849,405],{"class":337},[275,851,852],{"class":418},"title",[275,854,422],{"class":337},[275,856,408],{"class":337},[275,858,859],{"class":285},"My API",[275,861,408],{"class":337},[275,863,338],{"class":337},[275,865,866],{"class":418}," version",[275,868,422],{"class":337},[275,870,408],{"class":337},[275,872,771],{"class":285},[275,874,408],{"class":337},[275,876,877],{"class":337},"),\n",[275,879,881],{"class":277,"line":880},26,[275,882,432],{"class":337},[261,884,886],{"id":885},"standalone-application-alternative","Standalone Application (Alternative)",[57,888,889,890,893],{},"If you are building a standalone MCP server, you can use the ",[97,891,892],{},"MCP"," class which provides a simplified declarative API and programmatically boots the server using the standard Litestar CLI:",[266,895,897],{"className":314,"code":896,"language":316,"meta":271,"style":271},"from litestar_mcp import MCP\n\n# 1. Initialize the application\nmcp = MCP(\"my-mcp-server\", instructions=\"Exposes utility tools.\")\n\n# 2. Register tools, resources, or prompts using decorators\n@mcp.tool()\ndef add(a: int, b: int) -> int:\n    \"\"\"Calculate the sum of two integers.\"\"\"\n    return a + b\n\n# 3. Expose the app globally so that the CLI can discover it\napp = mcp.app\n\nif __name__ == \"__main__\":\n    # 4. Boot the server using Server-Sent Events (SSE)\n    mcp.run(port=8000)\n",[97,898,899,910,914,919,954,958,963,978,1011,1020,1033,1037,1042,1057,1061,1081,1086],{"__ignoreMap":271},[275,900,901,903,905,907],{"class":277,"line":278},[275,902,324],{"class":323},[275,904,375],{"class":327},[275,906,331],{"class":323},[275,908,909],{"class":327}," MCP\n",[275,911,912],{"class":277,"line":292},[275,913,386],{"emptyLinePlaceholder":31},[275,915,916],{"class":277,"line":299},[275,917,918],{"class":295},"# 1. Initialize the application\n",[275,920,921,924,926,929,931,933,936,938,940,943,945,947,950,952],{"class":277,"line":383},[275,922,923],{"class":327},"mcp ",[275,925,422],{"class":337},[275,927,928],{"class":401}," MCP",[275,930,405],{"class":337},[275,932,408],{"class":337},[275,934,935],{"class":285},"my-mcp-server",[275,937,408],{"class":337},[275,939,338],{"class":337},[275,941,942],{"class":418}," instructions",[275,944,422],{"class":337},[275,946,408],{"class":337},[275,948,949],{"class":285},"Exposes utility tools.",[275,951,408],{"class":337},[275,953,432],{"class":337},[275,955,956],{"class":277,"line":389},[275,957,386],{"emptyLinePlaceholder":31},[275,959,960],{"class":277,"line":395},[275,961,962],{"class":295},"# 2. Register tools, resources, or prompts using decorators\n",[275,964,965,967,970,972,975],{"class":277,"line":435},[275,966,398],{"class":337},[275,968,969],{"class":401},"mcp",[275,971,128],{"class":337},[275,973,974],{"class":401},"tool",[275,976,977],{"class":337},"()\n",[275,979,980,983,985,987,989,991,994,996,999,1001,1003,1005,1007,1009],{"class":277,"line":466},[275,981,982],{"class":438},"def",[275,984,305],{"class":401},[275,986,405],{"class":337},[275,988,63],{"class":418},[275,990,494],{"class":337},[275,992,993],{"class":281}," int",[275,995,338],{"class":337},[275,997,998],{"class":418}," b",[275,1000,494],{"class":337},[275,1002,993],{"class":281},[275,1004,613],{"class":337},[275,1006,451],{"class":337},[275,1008,993],{"class":281},[275,1010,620],{"class":337},[275,1012,1013,1015,1018],{"class":277,"line":478},[275,1014,469],{"class":323},[275,1016,1017],{"class":295},"Calculate the sum of two integers.",[275,1019,475],{"class":323},[275,1021,1022,1024,1027,1030],{"class":277,"line":557},[275,1023,481],{"class":323},[275,1025,1026],{"class":327}," a ",[275,1028,1029],{"class":337},"+",[275,1031,1032],{"class":327}," b\n",[275,1034,1035],{"class":277,"line":562},[275,1036,386],{"emptyLinePlaceholder":31},[275,1038,1039],{"class":277,"line":44},[275,1040,1041],{"class":295},"# 3. Expose the app globally so that the CLI can discover it\n",[275,1043,1044,1046,1048,1051,1053],{"class":277,"line":623},[275,1045,792],{"class":327},[275,1047,422],{"class":337},[275,1049,1050],{"class":327}," mcp",[275,1052,128],{"class":337},[275,1054,1056],{"class":1055},"sRlkE","app\n",[275,1058,1059],{"class":277,"line":633},[275,1060,386],{"emptyLinePlaceholder":31},[275,1062,1063,1066,1069,1072,1074,1077,1079],{"class":277,"line":676},[275,1064,1065],{"class":323},"if",[275,1067,1068],{"class":327}," __name__ ",[275,1070,1071],{"class":337},"==",[275,1073,503],{"class":337},[275,1075,1076],{"class":285},"__main__",[275,1078,408],{"class":337},[275,1080,620],{"class":337},[275,1082,1083],{"class":277,"line":681},[275,1084,1085],{"class":295},"    # 4. Boot the server using Server-Sent Events (SSE)\n",[275,1087,1088,1091,1093,1096,1098,1101,1103,1106],{"class":277,"line":713},[275,1089,1090],{"class":327},"    mcp",[275,1092,128],{"class":337},[275,1094,1095],{"class":401},"run",[275,1097,405],{"class":337},[275,1099,1100],{"class":418},"port",[275,1102,422],{"class":337},[275,1104,1105],{"class":497},"8000",[275,1107,432],{"class":337},[57,1109,1110,1111,100,1114,100,1117,100,1120,100,1123,100,1126,1129,1130,1132,1133,1135,1136,1139],{},"The standalone decorators accept Litestar route-handler keyword arguments such as ",[97,1112,1113],{},"dependencies",[97,1115,1116],{},"guards",[97,1118,1119],{},"response_headers",[97,1121,1122],{},"responses",[97,1124,1125],{},"summary",[97,1127,1128],{},"tags",", DTO options, hooks, and arbitrary extra kwargs stored in ",[97,1131,119],{},". The ",[97,1134,506],{}," keyword names the MCP primitive; use ",[97,1137,1138],{},"route_name"," to set Litestar's route-handler name separately.",[261,1141,1143],{"id":1142},"with-configuration","With Configuration",[266,1145,1147],{"className":314,"code":1146,"language":316,"meta":271,"style":271},"from litestar_mcp import LitestarMCP, MCPConfig\n\nconfig = MCPConfig(\n    base_path=\"\u002Fapi\u002Fmcp\",  # Change the base path\n    name=\"Custom Server Name\",  # Override server name\n    include_in_schema=True,  # Include MCP routes in OpenAPI schema\n)\n\napp = Litestar(\n    route_handlers=[get_users, analyze_data, get_app_config],\n    plugins=[LitestarMCP(config)],\n    openapi_config=OpenAPIConfig(title=\"My API\", version=\"1.0.0\"),\n)\n",[97,1148,1149,1165,1169,1180,1199,1218,1229,1233,1237,1247,1265,1281,1315],{"__ignoreMap":271},[275,1150,1151,1153,1155,1157,1160,1162],{"class":277,"line":278},[275,1152,324],{"class":323},[275,1154,375],{"class":327},[275,1156,331],{"class":323},[275,1158,1159],{"class":327}," LitestarMCP",[275,1161,338],{"class":337},[275,1163,1164],{"class":327}," MCPConfig\n",[275,1166,1167],{"class":277,"line":292},[275,1168,386],{"emptyLinePlaceholder":31},[275,1170,1171,1173,1175,1178],{"class":277,"line":299},[275,1172,363],{"class":327},[275,1174,422],{"class":337},[275,1176,1177],{"class":401}," MCPConfig",[275,1179,799],{"class":337},[275,1181,1182,1185,1187,1189,1192,1194,1196],{"class":277,"line":383},[275,1183,1184],{"class":418},"    base_path",[275,1186,422],{"class":337},[275,1188,408],{"class":337},[275,1190,1191],{"class":285},"\u002Fapi\u002Fmcp",[275,1193,408],{"class":337},[275,1195,338],{"class":337},[275,1197,1198],{"class":295},"  # Change the base path\n",[275,1200,1201,1204,1206,1208,1211,1213,1215],{"class":277,"line":389},[275,1202,1203],{"class":418},"    name",[275,1205,422],{"class":337},[275,1207,408],{"class":337},[275,1209,1210],{"class":285},"Custom Server Name",[275,1212,408],{"class":337},[275,1214,338],{"class":337},[275,1216,1217],{"class":295},"  # Override server name\n",[275,1219,1220,1223,1226],{"class":277,"line":395},[275,1221,1222],{"class":418},"    include_in_schema",[275,1224,1225],{"class":337},"=True,",[275,1227,1228],{"class":295},"  # Include MCP routes in OpenAPI schema\n",[275,1230,1231],{"class":277,"line":435},[275,1232,432],{"class":337},[275,1234,1235],{"class":277,"line":466},[275,1236,386],{"emptyLinePlaceholder":31},[275,1238,1239,1241,1243,1245],{"class":277,"line":478},[275,1240,792],{"class":327},[275,1242,422],{"class":337},[275,1244,334],{"class":401},[275,1246,799],{"class":337},[275,1248,1249,1251,1253,1255,1257,1259,1261,1263],{"class":277,"line":557},[275,1250,805],{"class":418},[275,1252,808],{"class":337},[275,1254,811],{"class":401},[275,1256,338],{"class":337},[275,1258,600],{"class":401},[275,1260,338],{"class":337},[275,1262,720],{"class":401},[275,1264,822],{"class":337},[275,1266,1267,1269,1271,1273,1275,1278],{"class":277,"line":562},[275,1268,828],{"class":418},[275,1270,808],{"class":337},[275,1272,833],{"class":401},[275,1274,405],{"class":337},[275,1276,1277],{"class":401},"config",[275,1279,1280],{"class":337},")],\n",[275,1282,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313],{"class":277,"line":44},[275,1284,842],{"class":418},[275,1286,422],{"class":337},[275,1288,847],{"class":401},[275,1290,405],{"class":337},[275,1292,852],{"class":418},[275,1294,422],{"class":337},[275,1296,408],{"class":337},[275,1298,859],{"class":285},[275,1300,408],{"class":337},[275,1302,338],{"class":337},[275,1304,866],{"class":418},[275,1306,422],{"class":337},[275,1308,408],{"class":337},[275,1310,771],{"class":285},[275,1312,408],{"class":337},[275,1314,877],{"class":337},[275,1316,1317],{"class":277,"line":623},[275,1318,432],{"class":337},[89,1320,1322],{"id":1321},"resources-vs-tools-when-to-use-each","Resources vs Tools: When to Use Each",[261,1324,1326,1327,1329],{"id":1325},"use-resources-mcp_resource-for","Use Resources (",[97,1328,174],{},") for",[134,1331,1332,1338,1344,1350],{},[137,1333,1334,1337],{},[140,1335,1336],{},"Read-only data"," that AI models need to reference",[137,1339,1340,1343],{},[140,1341,1342],{},"Static or semi-static information"," like documentation, schemas, configurations",[137,1345,1346,1349],{},[140,1347,1348],{},"Data that doesn't require parameters"," to retrieve",[137,1351,1352,1355],{},[140,1353,1354],{},"Reference material"," that AI models should \"know about\"",[57,1357,1358],{},[140,1359,1360],{},"Examples:",[266,1362,1364],{"className":314,"code":1363,"language":316,"meta":271,"style":271},"@get(\"\u002Fschema\", mcp_resource=\"database_schema\")\nasync def get_schema() -> dict:\n    \"\"\"Database schema information.\"\"\"\n    return {\"tables\": [\"users\", \"orders\"], \"relationships\": [...]}\n\n@get(\"\u002Fdocs\", mcp_resource=\"api_docs\")\nasync def get_documentation() -> dict:\n    \"\"\"API documentation and usage examples.\"\"\"\n    return {\"endpoints\": [...], \"examples\": [...]}\n",[97,1365,1366,1396,1413,1422,1476,1480,1510,1527,1536],{"__ignoreMap":271},[275,1367,1368,1370,1372,1374,1376,1379,1381,1383,1385,1387,1389,1392,1394],{"class":277,"line":278},[275,1369,398],{"class":337},[275,1371,402],{"class":401},[275,1373,405],{"class":337},[275,1375,408],{"class":337},[275,1377,1378],{"class":285},"\u002Fschema",[275,1380,408],{"class":337},[275,1382,338],{"class":337},[275,1384,699],{"class":418},[275,1386,422],{"class":337},[275,1388,408],{"class":337},[275,1390,1391],{"class":285},"database_schema",[275,1393,408],{"class":337},[275,1395,432],{"class":337},[275,1397,1398,1400,1402,1405,1407,1409,1411],{"class":277,"line":292},[275,1399,439],{"class":438},[275,1401,442],{"class":438},[275,1403,1404],{"class":401}," get_schema",[275,1406,448],{"class":337},[275,1408,451],{"class":337},[275,1410,610],{"class":281},[275,1412,620],{"class":337},[275,1414,1415,1417,1420],{"class":277,"line":299},[275,1416,469],{"class":323},[275,1418,1419],{"class":295},"Database schema information.",[275,1421,475],{"class":323},[275,1423,1424,1426,1428,1430,1433,1435,1437,1440,1442,1445,1447,1449,1451,1454,1456,1459,1461,1464,1466,1468,1470,1473],{"class":277,"line":383},[275,1425,481],{"class":323},[275,1427,523],{"class":337},[275,1429,408],{"class":337},[275,1431,1432],{"class":285},"tables",[275,1434,408],{"class":337},[275,1436,494],{"class":337},[275,1438,1439],{"class":337}," [",[275,1441,408],{"class":337},[275,1443,1444],{"class":285},"users",[275,1446,408],{"class":337},[275,1448,338],{"class":337},[275,1450,503],{"class":337},[275,1452,1453],{"class":285},"orders",[275,1455,408],{"class":337},[275,1457,1458],{"class":337},"],",[275,1460,503],{"class":337},[275,1462,1463],{"class":285},"relationships",[275,1465,408],{"class":337},[275,1467,494],{"class":337},[275,1469,1439],{"class":337},[275,1471,1472],{"class":327},"...",[275,1474,1475],{"class":337},"]}\n",[275,1477,1478],{"class":277,"line":389},[275,1479,386],{"emptyLinePlaceholder":31},[275,1481,1482,1484,1486,1488,1490,1493,1495,1497,1499,1501,1503,1506,1508],{"class":277,"line":395},[275,1483,398],{"class":337},[275,1485,402],{"class":401},[275,1487,405],{"class":337},[275,1489,408],{"class":337},[275,1491,1492],{"class":285},"\u002Fdocs",[275,1494,408],{"class":337},[275,1496,338],{"class":337},[275,1498,699],{"class":418},[275,1500,422],{"class":337},[275,1502,408],{"class":337},[275,1504,1505],{"class":285},"api_docs",[275,1507,408],{"class":337},[275,1509,432],{"class":337},[275,1511,1512,1514,1516,1519,1521,1523,1525],{"class":277,"line":435},[275,1513,439],{"class":438},[275,1515,442],{"class":438},[275,1517,1518],{"class":401}," get_documentation",[275,1520,448],{"class":337},[275,1522,451],{"class":337},[275,1524,610],{"class":281},[275,1526,620],{"class":337},[275,1528,1529,1531,1534],{"class":277,"line":466},[275,1530,469],{"class":323},[275,1532,1533],{"class":295},"API documentation and usage examples.",[275,1535,475],{"class":323},[275,1537,1538,1540,1542,1544,1547,1549,1551,1553,1555,1557,1559,1562,1564,1566,1568,1570],{"class":277,"line":478},[275,1539,481],{"class":323},[275,1541,523],{"class":337},[275,1543,408],{"class":337},[275,1545,1546],{"class":285},"endpoints",[275,1548,408],{"class":337},[275,1550,494],{"class":337},[275,1552,1439],{"class":337},[275,1554,1472],{"class":327},[275,1556,1458],{"class":337},[275,1558,503],{"class":337},[275,1560,1561],{"class":285},"examples",[275,1563,408],{"class":337},[275,1565,494],{"class":337},[275,1567,1439],{"class":337},[275,1569,1472],{"class":327},[275,1571,1475],{"class":337},[261,1573,1575,1576,1329],{"id":1574},"use-tools-mcp_tool-for","Use Tools (",[97,1577,171],{},[134,1579,1580,1586,1592,1598],{},[137,1581,1582,1585],{},[140,1583,1584],{},"Actions that perform operations"," or mutations",[137,1587,1588,1591],{},[140,1589,1590],{},"Dynamic queries"," that need input parameters",[137,1593,1594,1597],{},[140,1595,1596],{},"Operations that change state"," in your application",[137,1599,1600,1603],{},[140,1601,1602],{},"Computations or data processing"," tasks",[57,1605,1606],{},[140,1607,1360],{},[266,1609,1611],{"className":314,"code":1610,"language":316,"meta":271,"style":271},"@post(\"\u002Fusers\", mcp_tool=\"create_user\")\nasync def create_user(user_data: dict) -> dict:\n    \"\"\"Create a new user account.\"\"\"\n    # Perform user creation logic\n    return {\"id\": 123, \"created\": True}\n\n@get(\"\u002Fsearch\", mcp_tool=\"search_data\")\nasync def search(query: str, limit: int = 10) -> dict:\n    \"\"\"Search through application data.\"\"\"\n    # Perform search with parameters\n    return {\"results\": [...], \"total\": 42}\n",[97,1612,1613,1642,1668,1677,1682,1713,1717,1747,1789,1798,1803],{"__ignoreMap":271},[275,1614,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1638,1640],{"class":277,"line":278},[275,1616,398],{"class":337},[275,1618,567],{"class":401},[275,1620,405],{"class":337},[275,1622,408],{"class":337},[275,1624,411],{"class":285},[275,1626,408],{"class":337},[275,1628,338],{"class":337},[275,1630,419],{"class":418},[275,1632,422],{"class":337},[275,1634,408],{"class":337},[275,1636,1637],{"class":285},"create_user",[275,1639,408],{"class":337},[275,1641,432],{"class":337},[275,1643,1644,1646,1648,1651,1653,1656,1658,1660,1662,1664,1666],{"class":277,"line":292},[275,1645,439],{"class":438},[275,1647,442],{"class":438},[275,1649,1650],{"class":401}," create_user",[275,1652,405],{"class":337},[275,1654,1655],{"class":418},"user_data",[275,1657,494],{"class":337},[275,1659,610],{"class":281},[275,1661,613],{"class":337},[275,1663,451],{"class":337},[275,1665,610],{"class":281},[275,1667,620],{"class":337},[275,1669,1670,1672,1675],{"class":277,"line":299},[275,1671,469],{"class":323},[275,1673,1674],{"class":295},"Create a new user account.",[275,1676,475],{"class":323},[275,1678,1679],{"class":277,"line":383},[275,1680,1681],{"class":295},"    # Perform user creation logic\n",[275,1683,1684,1686,1688,1690,1692,1694,1696,1699,1701,1703,1706,1708,1710],{"class":277,"line":389},[275,1685,481],{"class":323},[275,1687,523],{"class":337},[275,1689,408],{"class":337},[275,1691,489],{"class":285},[275,1693,408],{"class":337},[275,1695,494],{"class":337},[275,1697,1698],{"class":497}," 123",[275,1700,338],{"class":337},[275,1702,503],{"class":337},[275,1704,1705],{"class":285},"created",[275,1707,408],{"class":337},[275,1709,494],{"class":337},[275,1711,1712],{"class":337}," True}\n",[275,1714,1715],{"class":277,"line":395},[275,1716,386],{"emptyLinePlaceholder":31},[275,1718,1719,1721,1723,1725,1727,1730,1732,1734,1736,1738,1740,1743,1745],{"class":277,"line":435},[275,1720,398],{"class":337},[275,1722,402],{"class":401},[275,1724,405],{"class":337},[275,1726,408],{"class":337},[275,1728,1729],{"class":285},"\u002Fsearch",[275,1731,408],{"class":337},[275,1733,338],{"class":337},[275,1735,419],{"class":418},[275,1737,422],{"class":337},[275,1739,408],{"class":337},[275,1741,1742],{"class":285},"search_data",[275,1744,408],{"class":337},[275,1746,432],{"class":337},[275,1748,1749,1751,1753,1756,1758,1761,1763,1766,1768,1771,1773,1775,1778,1781,1783,1785,1787],{"class":277,"line":466},[275,1750,439],{"class":438},[275,1752,442],{"class":438},[275,1754,1755],{"class":401}," search",[275,1757,405],{"class":337},[275,1759,1760],{"class":418},"query",[275,1762,494],{"class":337},[275,1764,1765],{"class":281}," str",[275,1767,338],{"class":337},[275,1769,1770],{"class":418}," limit",[275,1772,494],{"class":337},[275,1774,993],{"class":281},[275,1776,1777],{"class":337}," =",[275,1779,1780],{"class":497}," 10",[275,1782,613],{"class":337},[275,1784,451],{"class":337},[275,1786,610],{"class":281},[275,1788,620],{"class":337},[275,1790,1791,1793,1796],{"class":277,"line":478},[275,1792,469],{"class":323},[275,1794,1795],{"class":295},"Search through application data.",[275,1797,475],{"class":323},[275,1799,1800],{"class":277,"line":557},[275,1801,1802],{"class":295},"    # Perform search with parameters\n",[275,1804,1805,1807,1809,1811,1814,1816,1818,1820,1822,1824,1826,1829,1831,1833,1836],{"class":277,"line":562},[275,1806,481],{"class":323},[275,1808,523],{"class":337},[275,1810,408],{"class":337},[275,1812,1813],{"class":285},"results",[275,1815,408],{"class":337},[275,1817,494],{"class":337},[275,1819,1439],{"class":337},[275,1821,1472],{"class":327},[275,1823,1458],{"class":337},[275,1825,503],{"class":337},[275,1827,1828],{"class":285},"total",[275,1830,408],{"class":337},[275,1832,494],{"class":337},[275,1834,1835],{"class":497}," 42",[275,1837,673],{"class":337},[89,1839,1841],{"id":1840},"how-it-works","How It Works",[1843,1844,1845,1855,1867,1876],"ol",{},[137,1846,1847,1850,1851,1854],{},[140,1848,1849],{},"Route Discovery",": At app initialization, the plugin scans all route handlers for the ",[97,1852,1853],{},"opt"," attribute",[137,1856,1857,1860,1861,1863,1864,1866],{},[140,1858,1859],{},"Automatic Exposure",": Routes marked with ",[97,1862,171],{}," or ",[97,1865,174],{}," are automatically exposed",[137,1868,1869,1872,1873,613],{},[140,1870,1871],{},"MCP Transport",": The plugin adds a Streamable HTTP MCP endpoint under the configured base path (default ",[97,1874,1875],{},"\u002Fmcp",[137,1877,1878,1881],{},[140,1879,1880],{},"Server Info",": Server name and version are derived from your OpenAPI configuration",[89,1883,1885],{"id":1884},"mcp-endpoints","MCP Endpoints",[57,1887,1888],{},"Once configured, your application exposes these MCP-compatible endpoints:",[134,1890,1891,1901,1920,1926,1932],{},[137,1892,1893,1896,1897,1900],{},[97,1894,1895],{},"GET \u002Fmcp"," - Server-Sent Events stream when ",[97,1898,1899],{},"Accept: text\u002Fevent-stream"," is provided",[137,1902,1903,1906,1907,100,1910,100,1913,100,1916,1919],{},[97,1904,1905],{},"POST \u002Fmcp"," - JSON-RPC endpoint for ",[97,1908,1909],{},"initialize",[97,1911,1912],{},"ping",[97,1914,1915],{},"tools\u002F*",[97,1917,1918],{},"resources\u002F*",", and optional task methods",[137,1921,1922,1925],{},[97,1923,1924],{},"GET \u002F.well-known\u002Fmcp-server.json"," - MCP server manifest",[137,1927,1928,1931],{},[97,1929,1930],{},"GET \u002F.well-known\u002Fagent-card.json"," - Agent metadata card",[137,1933,1934,1937],{},[97,1935,1936],{},"GET \u002F.well-known\u002Foauth-protected-resource"," - OAuth protected resource metadata when auth is configured",[57,1939,1940],{},[140,1941,1942],{},"Built-in Resources:",[134,1944,1945],{},[137,1946,1947,1950,1951,613],{},[97,1948,1949],{},"litestar:\u002F\u002Fopenapi"," - Your application's OpenAPI schema (always available via ",[97,1952,1953],{},"resources\u002Fread",[89,1955,1957],{"id":1956},"configuration","Configuration",[57,1959,1960,1961,494],{},"Configure the plugin using ",[97,1962,1963],{},"MCPConfig",[266,1965,1967],{"className":314,"code":1966,"language":316,"meta":271,"style":271},"from litestar_mcp import MCPConfig\n\nconfig = MCPConfig()\n",[97,1968,1969,1979,1983],{"__ignoreMap":271},[275,1970,1971,1973,1975,1977],{"class":277,"line":278},[275,1972,324],{"class":323},[275,1974,375],{"class":327},[275,1976,331],{"class":323},[275,1978,1164],{"class":327},[275,1980,1981],{"class":277,"line":292},[275,1982,386],{"emptyLinePlaceholder":31},[275,1984,1985,1987,1989,1991],{"class":277,"line":299},[275,1986,363],{"class":327},[275,1988,422],{"class":337},[275,1990,1177],{"class":401},[275,1992,977],{"class":337},[57,1994,1995],{},[140,1996,1997],{},"Configuration Options:",[1999,2000,2001,2020],"table",{},[2002,2003,2004],"thead",{},[2005,2006,2007,2011,2014,2017],"tr",{},[2008,2009,2010],"th",{},"Option",[2008,2012,2013],{},"Type",[2008,2015,2016],{},"Default",[2008,2018,2019],{},"Description",[2021,2022,2023,2044,2064,2083,2101,2124,2142,2160,2178,2196,2219,2238,2261],"tbody",{},[2005,2024,2025,2031,2036,2041],{},[2026,2027,2028],"td",{},[97,2029,2030],{},"base_path",[2026,2032,2033],{},[97,2034,2035],{},"str",[2026,2037,2038],{},[97,2039,2040],{},"\"\u002Fmcp\"",[2026,2042,2043],{},"Base path for the MCP Streamable HTTP endpoint",[2005,2045,2046,2051,2056,2061],{},[2026,2047,2048],{},[97,2049,2050],{},"include_in_schema",[2026,2052,2053],{},[97,2054,2055],{},"bool",[2026,2057,2058],{},[97,2059,2060],{},"False",[2026,2062,2063],{},"Whether to include MCP routes in OpenAPI schema",[2005,2065,2066,2070,2075,2080],{},[2026,2067,2068],{},[97,2069,506],{},[2026,2071,2072],{},[97,2073,2074],{},"str | None",[2026,2076,2077],{},[97,2078,2079],{},"None",[2026,2081,2082],{},"Override server name. If None, uses OpenAPI title",[2005,2084,2085,2089,2094,2098],{},[2026,2086,2087],{},[97,2088,1116],{},[2026,2090,2091],{},[97,2092,2093],{},"list[Any] | None",[2026,2095,2096],{},[97,2097,2079],{},[2026,2099,2100],{},"Litestar guards applied to the MCP router",[2005,2102,2103,2108,2113,2117],{},[2026,2104,2105],{},[97,2106,2107],{},"allowed_origins",[2026,2109,2110],{},[97,2111,2112],{},"list[str] | None",[2026,2114,2115],{},[97,2116,2079],{},[2026,2118,2119,2120,2123],{},"Restrict accepted ",[97,2121,2122],{},"Origin"," header values",[2005,2125,2126,2131,2135,2139],{},[2026,2127,2128],{},[97,2129,2130],{},"include_operations",[2026,2132,2133],{},[97,2134,2112],{},[2026,2136,2137],{},[97,2138,2079],{},[2026,2140,2141],{},"Only expose matching operation names",[2005,2143,2144,2149,2153,2157],{},[2026,2145,2146],{},[97,2147,2148],{},"exclude_operations",[2026,2150,2151],{},[97,2152,2112],{},[2026,2154,2155],{},[97,2156,2079],{},[2026,2158,2159],{},"Exclude matching operation names",[2005,2161,2162,2167,2171,2175],{},[2026,2163,2164],{},[97,2165,2166],{},"include_tags",[2026,2168,2169],{},[97,2170,2112],{},[2026,2172,2173],{},[97,2174,2079],{},[2026,2176,2177],{},"Only expose routes with matching OpenAPI tags",[2005,2179,2180,2185,2189,2193],{},[2026,2181,2182],{},[97,2183,2184],{},"exclude_tags",[2026,2186,2187],{},[97,2188,2112],{},[2026,2190,2191],{},[97,2192,2079],{},[2026,2194,2195],{},"Exclude routes with matching OpenAPI tags",[2005,2197,2198,2203,2208,2212],{},[2026,2199,2200],{},[97,2201,2202],{},"auth",[2026,2204,2205],{},[97,2206,2207],{},"MCPAuthConfig | None",[2026,2209,2210],{},[97,2211,2079],{},[2026,2213,2214,2215,2218],{},"Metadata for ",[97,2216,2217],{},"\u002F.well-known\u002Foauth-protected-resource"," discovery",[2005,2220,2221,2226,2231,2235],{},[2026,2222,2223],{},[97,2224,2225],{},"tasks",[2026,2227,2228],{},[97,2229,2230],{},"bool | MCPTaskConfig",[2026,2232,2233],{},[97,2234,2060],{},[2026,2236,2237],{},"Enable experimental in-memory MCP task support",[2005,2239,2240,2245,2250,2254],{},[2026,2241,2242],{},[97,2243,2244],{},"before_tool_call",[2026,2246,2247],{},[97,2248,2249],{},"BeforeToolCallHook | None",[2026,2251,2252],{},[97,2253,2079],{},[2026,2255,2256,2257,2260],{},"Observe each ",[97,2258,2259],{},"tools\u002Fcall"," before dispatch",[2005,2262,2263,2268,2273,2277],{},[2026,2264,2265],{},[97,2266,2267],{},"after_tool_call",[2026,2269,2270],{},[97,2271,2272],{},"AfterToolCallHook | None",[2026,2274,2275],{},[97,2276,2079],{},[2026,2278,2256,2279,2281],{},[97,2280,2259],{}," result, exception, and duration",[89,2283,2285],{"id":2284},"complete-example","Complete Example",[266,2287,2289],{"className":314,"code":2288,"language":316,"meta":271,"style":271},"from litestar import Litestar, get, post, delete\nfrom litestar.openapi.config import OpenAPIConfig\nfrom litestar_mcp import LitestarMCP, MCPConfig\n\n# Resources - read-only reference data\n@get(\"\u002Fusers\u002Fschema\", mcp_resource=\"user_schema\")\nasync def get_user_schema() -> dict:\n    \"\"\"User data model schema.\"\"\"\n    return {\n        \"type\": \"object\",\n        \"properties\": {\n            \"id\": {\"type\": \"integer\"},\n            \"name\": {\"type\": \"string\"},\n            \"email\": {\"type\": \"string\"}\n        }\n    }\n\n@get(\"\u002Fapi\u002Finfo\", mcp_resource=\"api_info\")\nasync def get_api_info() -> dict:\n    \"\"\"API capabilities and information.\"\"\"\n    return {\n        \"version\": \"2.0.0\",\n        \"features\": [\"user_management\", \"data_analysis\"],\n        \"rate_limits\": {\"requests_per_minute\": 1000}\n    }\n\n# Tools - actionable operations\n@get(\"\u002Fusers\", mcp_tool=\"list_users\")\nasync def list_users(limit: int = 10) -> dict:\n    \"\"\"List users with optional limit.\"\"\"\n    # Fetch users from database\n    return {\"users\": [{\"id\": 1, \"name\": \"Alice\"}], \"total\": 1}\n\n@post(\"\u002Fusers\", mcp_tool=\"create_user\")\nasync def create_user(user_data: dict) -> dict:\n    \"\"\"Create a new user account.\"\"\"\n    # Create user logic\n    return {\"id\": 123, \"created\": True, \"user\": user_data}\n\n@post(\"\u002Fanalyze\", mcp_tool=\"analyze_dataset\")\nasync def analyze_dataset(config: dict) -> dict:\n    \"\"\"Analyze data with custom configuration.\"\"\"\n    # Analysis logic\n    return {\"insights\": [...], \"metrics\": {...}}\n\n# Regular routes (not exposed to MCP)\n@get(\"\u002Fhealth\")\nasync def health_check() -> dict:\n    return {\"status\": \"healthy\"}\n\n# MCP configuration\nmcp_config = MCPConfig(\n    name=\"User Management API\",\n    base_path=\"\u002Fmcp\"\n)\n\n# Create Litestar app\napp = Litestar(\n    route_handlers=[\n        get_user_schema, get_api_info,  # Resources\n        list_users, create_user, analyze_dataset,  # Tools\n        health_check  # Regular route\n    ],\n    plugins=[LitestarMCP(mcp_config)],\n    openapi_config=OpenAPIConfig(\n        title=\"User Management API\",\n        version=\"2.0.0\"\n    ),\n)\n",[97,2290,2291,2315,2333,2347,2351,2356,2386,2403,2412,2419,2441,2454,2485,2514,2543,2548,2553,2557,2587,2604,2613,2619,2638,2668,2695,2699,2703,2709,2738,2769,2779,2785,2843,2848,2877,2902,2911,2917,2960,2965,2995,3021,3031,3037,3075,3080,3086,3104,3122,3147,3152,3158,3170,3186,3200,3205,3210,3216,3227,3235,3250,3269,3278,3284,3300,3311,3327,3341,3347],{"__ignoreMap":271},[275,2292,2293,2295,2297,2299,2301,2303,2305,2307,2310,2312],{"class":277,"line":278},[275,2294,324],{"class":323},[275,2296,328],{"class":327},[275,2298,331],{"class":323},[275,2300,334],{"class":327},[275,2302,338],{"class":337},[275,2304,341],{"class":327},[275,2306,338],{"class":337},[275,2308,2309],{"class":327}," post",[275,2311,338],{"class":337},[275,2313,2314],{"class":327}," delete\n",[275,2316,2317,2319,2321,2323,2325,2327,2329,2331],{"class":277,"line":292},[275,2318,324],{"class":323},[275,2320,353],{"class":327},[275,2322,128],{"class":337},[275,2324,358],{"class":327},[275,2326,128],{"class":337},[275,2328,363],{"class":327},[275,2330,331],{"class":323},[275,2332,368],{"class":327},[275,2334,2335,2337,2339,2341,2343,2345],{"class":277,"line":299},[275,2336,324],{"class":323},[275,2338,375],{"class":327},[275,2340,331],{"class":323},[275,2342,1159],{"class":327},[275,2344,338],{"class":337},[275,2346,1164],{"class":327},[275,2348,2349],{"class":277,"line":383},[275,2350,386],{"emptyLinePlaceholder":31},[275,2352,2353],{"class":277,"line":389},[275,2354,2355],{"class":295},"# Resources - read-only reference data\n",[275,2357,2358,2360,2362,2364,2366,2369,2371,2373,2375,2377,2379,2382,2384],{"class":277,"line":395},[275,2359,398],{"class":337},[275,2361,402],{"class":401},[275,2363,405],{"class":337},[275,2365,408],{"class":337},[275,2367,2368],{"class":285},"\u002Fusers\u002Fschema",[275,2370,408],{"class":337},[275,2372,338],{"class":337},[275,2374,699],{"class":418},[275,2376,422],{"class":337},[275,2378,408],{"class":337},[275,2380,2381],{"class":285},"user_schema",[275,2383,408],{"class":337},[275,2385,432],{"class":337},[275,2387,2388,2390,2392,2395,2397,2399,2401],{"class":277,"line":435},[275,2389,439],{"class":438},[275,2391,442],{"class":438},[275,2393,2394],{"class":401}," get_user_schema",[275,2396,448],{"class":337},[275,2398,451],{"class":337},[275,2400,610],{"class":281},[275,2402,620],{"class":337},[275,2404,2405,2407,2410],{"class":277,"line":466},[275,2406,469],{"class":323},[275,2408,2409],{"class":295},"User data model schema.",[275,2411,475],{"class":323},[275,2413,2414,2416],{"class":277,"line":478},[275,2415,481],{"class":323},[275,2417,2418],{"class":337}," {\n",[275,2420,2421,2424,2427,2429,2431,2433,2436,2438],{"class":277,"line":557},[275,2422,2423],{"class":337},"        \"",[275,2425,2426],{"class":285},"type",[275,2428,408],{"class":337},[275,2430,494],{"class":337},[275,2432,503],{"class":337},[275,2434,2435],{"class":285},"object",[275,2437,408],{"class":337},[275,2439,2440],{"class":337},",\n",[275,2442,2443,2445,2448,2450,2452],{"class":277,"line":562},[275,2444,2423],{"class":337},[275,2446,2447],{"class":285},"properties",[275,2449,408],{"class":337},[275,2451,494],{"class":337},[275,2453,2418],{"class":337},[275,2455,2456,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477,2480,2482],{"class":277,"line":44},[275,2457,2458],{"class":337},"            \"",[275,2460,489],{"class":285},[275,2462,408],{"class":337},[275,2464,494],{"class":337},[275,2466,523],{"class":337},[275,2468,408],{"class":337},[275,2470,2426],{"class":285},[275,2472,408],{"class":337},[275,2474,494],{"class":337},[275,2476,503],{"class":337},[275,2478,2479],{"class":285},"integer",[275,2481,408],{"class":337},[275,2483,2484],{"class":337},"},\n",[275,2486,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2510,2512],{"class":277,"line":623},[275,2488,2458],{"class":337},[275,2490,506],{"class":285},[275,2492,408],{"class":337},[275,2494,494],{"class":337},[275,2496,523],{"class":337},[275,2498,408],{"class":337},[275,2500,2426],{"class":285},[275,2502,408],{"class":337},[275,2504,494],{"class":337},[275,2506,503],{"class":337},[275,2508,2509],{"class":285},"string",[275,2511,408],{"class":337},[275,2513,2484],{"class":337},[275,2515,2516,2518,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541],{"class":277,"line":633},[275,2517,2458],{"class":337},[275,2519,2520],{"class":285},"email",[275,2522,408],{"class":337},[275,2524,494],{"class":337},[275,2526,523],{"class":337},[275,2528,408],{"class":337},[275,2530,2426],{"class":285},[275,2532,408],{"class":337},[275,2534,494],{"class":337},[275,2536,503],{"class":337},[275,2538,2509],{"class":285},[275,2540,408],{"class":337},[275,2542,673],{"class":337},[275,2544,2545],{"class":277,"line":676},[275,2546,2547],{"class":337},"        }\n",[275,2549,2550],{"class":277,"line":681},[275,2551,2552],{"class":337},"    }\n",[275,2554,2555],{"class":277,"line":713},[275,2556,386],{"emptyLinePlaceholder":31},[275,2558,2559,2561,2563,2565,2567,2570,2572,2574,2576,2578,2580,2583,2585],{"class":277,"line":731},[275,2560,398],{"class":337},[275,2562,402],{"class":401},[275,2564,405],{"class":337},[275,2566,408],{"class":337},[275,2568,2569],{"class":285},"\u002Fapi\u002Finfo",[275,2571,408],{"class":337},[275,2573,338],{"class":337},[275,2575,699],{"class":418},[275,2577,422],{"class":337},[275,2579,408],{"class":337},[275,2581,2582],{"class":285},"api_info",[275,2584,408],{"class":337},[275,2586,432],{"class":337},[275,2588,2589,2591,2593,2596,2598,2600,2602],{"class":277,"line":741},[275,2590,439],{"class":438},[275,2592,442],{"class":438},[275,2594,2595],{"class":401}," get_api_info",[275,2597,448],{"class":337},[275,2599,451],{"class":337},[275,2601,610],{"class":281},[275,2603,620],{"class":337},[275,2605,2606,2608,2611],{"class":277,"line":778},[275,2607,469],{"class":323},[275,2609,2610],{"class":295},"API capabilities and information.",[275,2612,475],{"class":323},[275,2614,2615,2617],{"class":277,"line":783},[275,2616,481],{"class":323},[275,2618,2418],{"class":337},[275,2620,2621,2623,2625,2627,2629,2631,2634,2636],{"class":277,"line":789},[275,2622,2423],{"class":337},[275,2624,762],{"class":285},[275,2626,408],{"class":337},[275,2628,494],{"class":337},[275,2630,503],{"class":337},[275,2632,2633],{"class":285},"2.0.0",[275,2635,408],{"class":337},[275,2637,2440],{"class":337},[275,2639,2640,2642,2644,2646,2648,2650,2652,2655,2657,2659,2661,2664,2666],{"class":277,"line":802},[275,2641,2423],{"class":337},[275,2643,131],{"class":285},[275,2645,408],{"class":337},[275,2647,494],{"class":337},[275,2649,1439],{"class":337},[275,2651,408],{"class":337},[275,2653,2654],{"class":285},"user_management",[275,2656,408],{"class":337},[275,2658,338],{"class":337},[275,2660,503],{"class":337},[275,2662,2663],{"class":285},"data_analysis",[275,2665,408],{"class":337},[275,2667,822],{"class":337},[275,2669,2670,2672,2675,2677,2679,2681,2683,2686,2688,2690,2693],{"class":277,"line":825},[275,2671,2423],{"class":337},[275,2673,2674],{"class":285},"rate_limits",[275,2676,408],{"class":337},[275,2678,494],{"class":337},[275,2680,523],{"class":337},[275,2682,408],{"class":337},[275,2684,2685],{"class":285},"requests_per_minute",[275,2687,408],{"class":337},[275,2689,494],{"class":337},[275,2691,2692],{"class":497}," 1000",[275,2694,673],{"class":337},[275,2696,2697],{"class":277,"line":839},[275,2698,2552],{"class":337},[275,2700,2701],{"class":277,"line":880},[275,2702,386],{"emptyLinePlaceholder":31},[275,2704,2706],{"class":277,"line":2705},27,[275,2707,2708],{"class":295},"# Tools - actionable operations\n",[275,2710,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730,2732,2734,2736],{"class":277,"line":2711},28,[275,2713,398],{"class":337},[275,2715,402],{"class":401},[275,2717,405],{"class":337},[275,2719,408],{"class":337},[275,2721,411],{"class":285},[275,2723,408],{"class":337},[275,2725,338],{"class":337},[275,2727,419],{"class":418},[275,2729,422],{"class":337},[275,2731,408],{"class":337},[275,2733,427],{"class":285},[275,2735,408],{"class":337},[275,2737,432],{"class":337},[275,2739,2741,2743,2745,2748,2750,2753,2755,2757,2759,2761,2763,2765,2767],{"class":277,"line":2740},29,[275,2742,439],{"class":438},[275,2744,442],{"class":438},[275,2746,2747],{"class":401}," list_users",[275,2749,405],{"class":337},[275,2751,2752],{"class":418},"limit",[275,2754,494],{"class":337},[275,2756,993],{"class":281},[275,2758,1777],{"class":337},[275,2760,1780],{"class":497},[275,2762,613],{"class":337},[275,2764,451],{"class":337},[275,2766,610],{"class":281},[275,2768,620],{"class":337},[275,2770,2772,2774,2777],{"class":277,"line":2771},30,[275,2773,469],{"class":323},[275,2775,2776],{"class":295},"List users with optional limit.",[275,2778,475],{"class":323},[275,2780,2782],{"class":277,"line":2781},31,[275,2783,2784],{"class":295},"    # Fetch users from database\n",[275,2786,2788,2790,2792,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2831,2833,2835,2837,2839,2841],{"class":277,"line":2787},32,[275,2789,481],{"class":323},[275,2791,523],{"class":337},[275,2793,408],{"class":337},[275,2795,1444],{"class":285},[275,2797,408],{"class":337},[275,2799,494],{"class":337},[275,2801,484],{"class":337},[275,2803,408],{"class":337},[275,2805,489],{"class":285},[275,2807,408],{"class":337},[275,2809,494],{"class":337},[275,2811,498],{"class":497},[275,2813,338],{"class":337},[275,2815,503],{"class":337},[275,2817,506],{"class":285},[275,2819,408],{"class":337},[275,2821,494],{"class":337},[275,2823,503],{"class":337},[275,2825,515],{"class":285},[275,2827,408],{"class":337},[275,2829,2830],{"class":337},"}],",[275,2832,503],{"class":337},[275,2834,1828],{"class":285},[275,2836,408],{"class":337},[275,2838,494],{"class":337},[275,2840,498],{"class":497},[275,2842,673],{"class":337},[275,2844,2846],{"class":277,"line":2845},33,[275,2847,386],{"emptyLinePlaceholder":31},[275,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875],{"class":277,"line":2850},34,[275,2852,398],{"class":337},[275,2854,567],{"class":401},[275,2856,405],{"class":337},[275,2858,408],{"class":337},[275,2860,411],{"class":285},[275,2862,408],{"class":337},[275,2864,338],{"class":337},[275,2866,419],{"class":418},[275,2868,422],{"class":337},[275,2870,408],{"class":337},[275,2872,1637],{"class":285},[275,2874,408],{"class":337},[275,2876,432],{"class":337},[275,2878,2880,2882,2884,2886,2888,2890,2892,2894,2896,2898,2900],{"class":277,"line":2879},35,[275,2881,439],{"class":438},[275,2883,442],{"class":438},[275,2885,1650],{"class":401},[275,2887,405],{"class":337},[275,2889,1655],{"class":418},[275,2891,494],{"class":337},[275,2893,610],{"class":281},[275,2895,613],{"class":337},[275,2897,451],{"class":337},[275,2899,610],{"class":281},[275,2901,620],{"class":337},[275,2903,2905,2907,2909],{"class":277,"line":2904},36,[275,2906,469],{"class":323},[275,2908,1674],{"class":295},[275,2910,475],{"class":323},[275,2912,2914],{"class":277,"line":2913},37,[275,2915,2916],{"class":295},"    # Create user logic\n",[275,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2951,2953,2955,2958],{"class":277,"line":2919},38,[275,2921,481],{"class":323},[275,2923,523],{"class":337},[275,2925,408],{"class":337},[275,2927,489],{"class":285},[275,2929,408],{"class":337},[275,2931,494],{"class":337},[275,2933,1698],{"class":497},[275,2935,338],{"class":337},[275,2937,503],{"class":337},[275,2939,1705],{"class":285},[275,2941,408],{"class":337},[275,2943,494],{"class":337},[275,2945,757],{"class":337},[275,2947,503],{"class":337},[275,2949,2950],{"class":285},"user",[275,2952,408],{"class":337},[275,2954,494],{"class":337},[275,2956,2957],{"class":327}," user_data",[275,2959,673],{"class":337},[275,2961,2963],{"class":277,"line":2962},39,[275,2964,386],{"emptyLinePlaceholder":31},[275,2966,2968,2970,2972,2974,2976,2978,2980,2982,2984,2986,2988,2991,2993],{"class":277,"line":2967},40,[275,2969,398],{"class":337},[275,2971,567],{"class":401},[275,2973,405],{"class":337},[275,2975,408],{"class":337},[275,2977,574],{"class":285},[275,2979,408],{"class":337},[275,2981,338],{"class":337},[275,2983,419],{"class":418},[275,2985,422],{"class":337},[275,2987,408],{"class":337},[275,2989,2990],{"class":285},"analyze_dataset",[275,2992,408],{"class":337},[275,2994,432],{"class":337},[275,2996,2998,3000,3002,3005,3007,3009,3011,3013,3015,3017,3019],{"class":277,"line":2997},41,[275,2999,439],{"class":438},[275,3001,442],{"class":438},[275,3003,3004],{"class":401}," analyze_dataset",[275,3006,405],{"class":337},[275,3008,1277],{"class":418},[275,3010,494],{"class":337},[275,3012,610],{"class":281},[275,3014,613],{"class":337},[275,3016,451],{"class":337},[275,3018,610],{"class":281},[275,3020,620],{"class":337},[275,3022,3024,3026,3029],{"class":277,"line":3023},42,[275,3025,469],{"class":323},[275,3027,3028],{"class":295},"Analyze data with custom configuration.",[275,3030,475],{"class":323},[275,3032,3034],{"class":277,"line":3033},43,[275,3035,3036],{"class":295},"    # Analysis logic\n",[275,3038,3040,3042,3044,3046,3049,3051,3053,3055,3057,3059,3061,3064,3066,3068,3070,3072],{"class":277,"line":3039},44,[275,3041,481],{"class":323},[275,3043,523],{"class":337},[275,3045,408],{"class":337},[275,3047,3048],{"class":285},"insights",[275,3050,408],{"class":337},[275,3052,494],{"class":337},[275,3054,1439],{"class":337},[275,3056,1472],{"class":327},[275,3058,1458],{"class":337},[275,3060,503],{"class":337},[275,3062,3063],{"class":285},"metrics",[275,3065,408],{"class":337},[275,3067,494],{"class":337},[275,3069,523],{"class":337},[275,3071,1472],{"class":327},[275,3073,3074],{"class":337},"}}\n",[275,3076,3078],{"class":277,"line":3077},45,[275,3079,386],{"emptyLinePlaceholder":31},[275,3081,3083],{"class":277,"line":3082},46,[275,3084,3085],{"class":295},"# Regular routes (not exposed to MCP)\n",[275,3087,3089,3091,3093,3095,3097,3100,3102],{"class":277,"line":3088},47,[275,3090,398],{"class":337},[275,3092,402],{"class":401},[275,3094,405],{"class":337},[275,3096,408],{"class":337},[275,3098,3099],{"class":285},"\u002Fhealth",[275,3101,408],{"class":337},[275,3103,432],{"class":337},[275,3105,3107,3109,3111,3114,3116,3118,3120],{"class":277,"line":3106},48,[275,3108,439],{"class":438},[275,3110,442],{"class":438},[275,3112,3113],{"class":401}," health_check",[275,3115,448],{"class":337},[275,3117,451],{"class":337},[275,3119,610],{"class":281},[275,3121,620],{"class":337},[275,3123,3125,3127,3129,3131,3134,3136,3138,3140,3143,3145],{"class":277,"line":3124},49,[275,3126,481],{"class":323},[275,3128,523],{"class":337},[275,3130,408],{"class":337},[275,3132,3133],{"class":285},"status",[275,3135,408],{"class":337},[275,3137,494],{"class":337},[275,3139,503],{"class":337},[275,3141,3142],{"class":285},"healthy",[275,3144,408],{"class":337},[275,3146,673],{"class":337},[275,3148,3150],{"class":277,"line":3149},50,[275,3151,386],{"emptyLinePlaceholder":31},[275,3153,3155],{"class":277,"line":3154},51,[275,3156,3157],{"class":295},"# MCP configuration\n",[275,3159,3161,3164,3166,3168],{"class":277,"line":3160},52,[275,3162,3163],{"class":327},"mcp_config ",[275,3165,422],{"class":337},[275,3167,1177],{"class":401},[275,3169,799],{"class":337},[275,3171,3173,3175,3177,3179,3182,3184],{"class":277,"line":3172},53,[275,3174,1203],{"class":418},[275,3176,422],{"class":337},[275,3178,408],{"class":337},[275,3180,3181],{"class":285},"User Management API",[275,3183,408],{"class":337},[275,3185,2440],{"class":337},[275,3187,3189,3191,3193,3195,3197],{"class":277,"line":3188},54,[275,3190,1184],{"class":418},[275,3192,422],{"class":337},[275,3194,408],{"class":337},[275,3196,1875],{"class":285},[275,3198,3199],{"class":337},"\"\n",[275,3201,3203],{"class":277,"line":3202},55,[275,3204,432],{"class":337},[275,3206,3208],{"class":277,"line":3207},56,[275,3209,386],{"emptyLinePlaceholder":31},[275,3211,3213],{"class":277,"line":3212},57,[275,3214,3215],{"class":295},"# Create Litestar app\n",[275,3217,3219,3221,3223,3225],{"class":277,"line":3218},58,[275,3220,792],{"class":327},[275,3222,422],{"class":337},[275,3224,334],{"class":401},[275,3226,799],{"class":337},[275,3228,3230,3232],{"class":277,"line":3229},59,[275,3231,805],{"class":418},[275,3233,3234],{"class":337},"=[\n",[275,3236,3238,3241,3243,3245,3247],{"class":277,"line":3237},60,[275,3239,3240],{"class":401},"        get_user_schema",[275,3242,338],{"class":337},[275,3244,2595],{"class":401},[275,3246,338],{"class":337},[275,3248,3249],{"class":295},"  # Resources\n",[275,3251,3253,3256,3258,3260,3262,3264,3266],{"class":277,"line":3252},61,[275,3254,3255],{"class":401},"        list_users",[275,3257,338],{"class":337},[275,3259,1650],{"class":401},[275,3261,338],{"class":337},[275,3263,3004],{"class":401},[275,3265,338],{"class":337},[275,3267,3268],{"class":295},"  # Tools\n",[275,3270,3272,3275],{"class":277,"line":3271},62,[275,3273,3274],{"class":401},"        health_check  ",[275,3276,3277],{"class":295},"# Regular route\n",[275,3279,3281],{"class":277,"line":3280},63,[275,3282,3283],{"class":337},"    ],\n",[275,3285,3287,3289,3291,3293,3295,3298],{"class":277,"line":3286},64,[275,3288,828],{"class":418},[275,3290,808],{"class":337},[275,3292,833],{"class":401},[275,3294,405],{"class":337},[275,3296,3297],{"class":401},"mcp_config",[275,3299,1280],{"class":337},[275,3301,3303,3305,3307,3309],{"class":277,"line":3302},65,[275,3304,842],{"class":418},[275,3306,422],{"class":337},[275,3308,847],{"class":401},[275,3310,799],{"class":337},[275,3312,3314,3317,3319,3321,3323,3325],{"class":277,"line":3313},66,[275,3315,3316],{"class":418},"        title",[275,3318,422],{"class":337},[275,3320,408],{"class":337},[275,3322,3181],{"class":285},[275,3324,408],{"class":337},[275,3326,2440],{"class":337},[275,3328,3330,3333,3335,3337,3339],{"class":277,"line":3329},67,[275,3331,3332],{"class":418},"        version",[275,3334,422],{"class":337},[275,3336,408],{"class":337},[275,3338,2633],{"class":285},[275,3340,3199],{"class":337},[275,3342,3344],{"class":277,"line":3343},68,[275,3345,3346],{"class":337},"    ),\n",[275,3348,3350],{"class":277,"line":3349},69,[275,3351,432],{"class":337},[89,3353,3355],{"id":3354},"authentication","Authentication",[57,3357,3358,3359,3362,3363,158,3366,3369],{},"Authentication is a ",[140,3360,3361],{},"Litestar middleware"," concern. Apps with an existing auth\nmiddleware get MCP authentication for free — ",[97,3364,3365],{},"request.user",[97,3367,3368],{},"request.auth","\nare populated before tool handlers run. Three integration paths:",[261,3371,3373],{"id":3372},"path-a-bring-your-own-middleware","Path A — Bring Your Own Middleware",[57,3375,3376,3377,3380],{},"If your Litestar app already ships an ",[97,3378,3379],{},"AbstractAuthenticationMiddleware"," (or\nLitestar's built-in JWT backends), MCP inherits it automatically:",[266,3382,3384],{"className":314,"code":3383,"language":316,"meta":271,"style":271},"from litestar import Litestar\nfrom litestar.middleware import DefineMiddleware\nfrom litestar_mcp import LitestarMCP, MCPConfig\n\napp = Litestar(\n    route_handlers=[...],\n    plugins=[LitestarMCP(MCPConfig())],\n    middleware=[DefineMiddleware(YourAuthMiddleware)],  # MCP gets this for free\n)\n",[97,3385,3386,3397,3413,3427,3431,3441,3451,3466,3487],{"__ignoreMap":271},[275,3387,3388,3390,3392,3394],{"class":277,"line":278},[275,3389,324],{"class":323},[275,3391,328],{"class":327},[275,3393,331],{"class":323},[275,3395,3396],{"class":327}," Litestar\n",[275,3398,3399,3401,3403,3405,3408,3410],{"class":277,"line":292},[275,3400,324],{"class":323},[275,3402,353],{"class":327},[275,3404,128],{"class":337},[275,3406,3407],{"class":327},"middleware ",[275,3409,331],{"class":323},[275,3411,3412],{"class":327}," DefineMiddleware\n",[275,3414,3415,3417,3419,3421,3423,3425],{"class":277,"line":299},[275,3416,324],{"class":323},[275,3418,375],{"class":327},[275,3420,331],{"class":323},[275,3422,1159],{"class":327},[275,3424,338],{"class":337},[275,3426,1164],{"class":327},[275,3428,3429],{"class":277,"line":383},[275,3430,386],{"emptyLinePlaceholder":31},[275,3432,3433,3435,3437,3439],{"class":277,"line":389},[275,3434,792],{"class":327},[275,3436,422],{"class":337},[275,3438,334],{"class":401},[275,3440,799],{"class":337},[275,3442,3443,3445,3447,3449],{"class":277,"line":395},[275,3444,805],{"class":418},[275,3446,808],{"class":337},[275,3448,1472],{"class":401},[275,3450,822],{"class":337},[275,3452,3453,3455,3457,3459,3461,3463],{"class":277,"line":435},[275,3454,828],{"class":418},[275,3456,808],{"class":337},[275,3458,833],{"class":401},[275,3460,405],{"class":337},[275,3462,1963],{"class":401},[275,3464,3465],{"class":337},"())],\n",[275,3467,3468,3471,3473,3476,3478,3481,3484],{"class":277,"line":466},[275,3469,3470],{"class":418},"    middleware",[275,3472,808],{"class":337},[275,3474,3475],{"class":401},"DefineMiddleware",[275,3477,405],{"class":337},[275,3479,3480],{"class":401},"YourAuthMiddleware",[275,3482,3483],{"class":337},")],",[275,3485,3486],{"class":295},"  # MCP gets this for free\n",[275,3488,3489],{"class":277,"line":478},[275,3490,432],{"class":337},[57,3492,3493,3494,3497],{},"See ",[97,3495,3496],{},"docs\u002Fexamples\u002Fnotes\u002Fsqlspec\u002Fgoogle_iap.py"," for a runnable example.",[261,3499,3501],{"id":3500},"path-b-built-in-mcpauthbackend","Path B — Built-in MCPAuthBackend",[57,3503,3504,3505,494],{},"For OIDC workloads, install the built-in ",[97,3506,240],{},[266,3508,3510],{"className":314,"code":3509,"language":316,"meta":271,"style":271},"from litestar import Litestar\nfrom litestar.middleware import DefineMiddleware\nfrom litestar_mcp import LitestarMCP, MCPAuthBackend, MCPConfig, OIDCProviderConfig\nfrom litestar_mcp.auth import MCPAuthConfig\n\napp = Litestar(\n    route_handlers=[...],\n    plugins=[LitestarMCP(MCPConfig(auth=MCPAuthConfig(\n        issuer=\"https:\u002F\u002Fcompany.okta.com\",\n        audience=\"api:\u002F\u002Fmcp-tools\",\n    )))],\n    middleware=[DefineMiddleware(\n        MCPAuthBackend,\n        providers=[OIDCProviderConfig(\n            issuer=\"https:\u002F\u002Fcompany.okta.com\",\n            audience=\"api:\u002F\u002Fmcp-tools\",\n        )],\n        user_resolver=lambda claims, app: MyUser(sub=claims[\"sub\"]),\n    )],\n)\n",[97,3511,3512,3522,3536,3560,3577,3581,3591,3601,3624,3640,3656,3661,3671,3678,3690,3705,3720,3725,3769,3774],{"__ignoreMap":271},[275,3513,3514,3516,3518,3520],{"class":277,"line":278},[275,3515,324],{"class":323},[275,3517,328],{"class":327},[275,3519,331],{"class":323},[275,3521,3396],{"class":327},[275,3523,3524,3526,3528,3530,3532,3534],{"class":277,"line":292},[275,3525,324],{"class":323},[275,3527,353],{"class":327},[275,3529,128],{"class":337},[275,3531,3407],{"class":327},[275,3533,331],{"class":323},[275,3535,3412],{"class":327},[275,3537,3538,3540,3542,3544,3546,3548,3551,3553,3555,3557],{"class":277,"line":299},[275,3539,324],{"class":323},[275,3541,375],{"class":327},[275,3543,331],{"class":323},[275,3545,1159],{"class":327},[275,3547,338],{"class":337},[275,3549,3550],{"class":327}," MCPAuthBackend",[275,3552,338],{"class":337},[275,3554,1177],{"class":327},[275,3556,338],{"class":337},[275,3558,3559],{"class":327}," OIDCProviderConfig\n",[275,3561,3562,3564,3567,3569,3572,3574],{"class":277,"line":383},[275,3563,324],{"class":323},[275,3565,3566],{"class":327}," litestar_mcp",[275,3568,128],{"class":337},[275,3570,3571],{"class":327},"auth ",[275,3573,331],{"class":323},[275,3575,3576],{"class":327}," MCPAuthConfig\n",[275,3578,3579],{"class":277,"line":389},[275,3580,386],{"emptyLinePlaceholder":31},[275,3582,3583,3585,3587,3589],{"class":277,"line":395},[275,3584,792],{"class":327},[275,3586,422],{"class":337},[275,3588,334],{"class":401},[275,3590,799],{"class":337},[275,3592,3593,3595,3597,3599],{"class":277,"line":435},[275,3594,805],{"class":418},[275,3596,808],{"class":337},[275,3598,1472],{"class":401},[275,3600,822],{"class":337},[275,3602,3603,3605,3607,3609,3611,3613,3615,3617,3619,3622],{"class":277,"line":466},[275,3604,828],{"class":418},[275,3606,808],{"class":337},[275,3608,833],{"class":401},[275,3610,405],{"class":337},[275,3612,1963],{"class":401},[275,3614,405],{"class":337},[275,3616,2202],{"class":418},[275,3618,422],{"class":337},[275,3620,3621],{"class":401},"MCPAuthConfig",[275,3623,799],{"class":337},[275,3625,3626,3629,3631,3633,3636,3638],{"class":277,"line":478},[275,3627,3628],{"class":418},"        issuer",[275,3630,422],{"class":337},[275,3632,408],{"class":337},[275,3634,3635],{"class":285},"https:\u002F\u002Fcompany.okta.com",[275,3637,408],{"class":337},[275,3639,2440],{"class":337},[275,3641,3642,3645,3647,3649,3652,3654],{"class":277,"line":557},[275,3643,3644],{"class":418},"        audience",[275,3646,422],{"class":337},[275,3648,408],{"class":337},[275,3650,3651],{"class":285},"api:\u002F\u002Fmcp-tools",[275,3653,408],{"class":337},[275,3655,2440],{"class":337},[275,3657,3658],{"class":277,"line":562},[275,3659,3660],{"class":337},"    )))],\n",[275,3662,3663,3665,3667,3669],{"class":277,"line":44},[275,3664,3470],{"class":418},[275,3666,808],{"class":337},[275,3668,3475],{"class":401},[275,3670,799],{"class":337},[275,3672,3673,3676],{"class":277,"line":623},[275,3674,3675],{"class":401},"        MCPAuthBackend",[275,3677,2440],{"class":337},[275,3679,3680,3683,3685,3688],{"class":277,"line":633},[275,3681,3682],{"class":418},"        providers",[275,3684,808],{"class":337},[275,3686,3687],{"class":401},"OIDCProviderConfig",[275,3689,799],{"class":337},[275,3691,3692,3695,3697,3699,3701,3703],{"class":277,"line":676},[275,3693,3694],{"class":418},"            issuer",[275,3696,422],{"class":337},[275,3698,408],{"class":337},[275,3700,3635],{"class":285},[275,3702,408],{"class":337},[275,3704,2440],{"class":337},[275,3706,3707,3710,3712,3714,3716,3718],{"class":277,"line":681},[275,3708,3709],{"class":418},"            audience",[275,3711,422],{"class":337},[275,3713,408],{"class":337},[275,3715,3651],{"class":285},[275,3717,408],{"class":337},[275,3719,2440],{"class":337},[275,3721,3722],{"class":277,"line":713},[275,3723,3724],{"class":337},"        )],\n",[275,3726,3727,3730,3732,3735,3738,3740,3743,3745,3748,3750,3753,3755,3758,3760,3762,3764,3766],{"class":277,"line":731},[275,3728,3729],{"class":418},"        user_resolver",[275,3731,422],{"class":337},[275,3733,3734],{"class":438},"lambda",[275,3736,3737],{"class":418}," claims",[275,3739,338],{"class":337},[275,3741,3742],{"class":418}," app",[275,3744,494],{"class":337},[275,3746,3747],{"class":401}," MyUser",[275,3749,405],{"class":337},[275,3751,3752],{"class":418},"sub",[275,3754,422],{"class":337},[275,3756,3757],{"class":401},"claims",[275,3759,457],{"class":337},[275,3761,408],{"class":337},[275,3763,3752],{"class":285},[275,3765,408],{"class":337},[275,3767,3768],{"class":337},"]),\n",[275,3770,3771],{"class":277,"line":741},[275,3772,3773],{"class":337},"    )],\n",[275,3775,3776],{"class":277,"line":778},[275,3777,432],{"class":337},[57,3779,3780,3781,3784,3785,3788],{},"JWKS auto-discovery, caching, and ",[97,3782,3783],{},"clock_skew"," tolerance are built in.\nSee ",[97,3786,3787],{},"docs\u002Fexamples\u002Fnotes\u002Fsqlspec\u002Fcloud_run_jwt.py"," for the full pattern.",[261,3790,3792],{"id":3791},"path-c-composable-oidc-factory","Path C — Composable OIDC Factory",[57,3794,3795,3797,3798,3801],{},[97,3796,244],{}," returns an async callable for use as\n",[97,3799,3800],{},"MCPAuthBackend(token_validator=...)"," or inside your own middleware:",[266,3803,3805],{"className":314,"code":3804,"language":316,"meta":271,"style":271},"from litestar_mcp import create_oidc_validator\n\nvalidator = create_oidc_validator(\n    \"https:\u002F\u002Fcloud.google.com\u002Fiap\",\n    \"\u002Fprojects\u002FPROJECT_NUMBER\u002Fglobal\u002FbackendServices\u002FSERVICE_ID\",\n    algorithms=(\"ES256\",),\n    jwks_cache_ttl=1800,\n)\n",[97,3806,3807,3818,3822,3834,3846,3857,3875,3887],{"__ignoreMap":271},[275,3808,3809,3811,3813,3815],{"class":277,"line":278},[275,3810,324],{"class":323},[275,3812,375],{"class":327},[275,3814,331],{"class":323},[275,3816,3817],{"class":327}," create_oidc_validator\n",[275,3819,3820],{"class":277,"line":292},[275,3821,386],{"emptyLinePlaceholder":31},[275,3823,3824,3827,3829,3832],{"class":277,"line":299},[275,3825,3826],{"class":327},"validator ",[275,3828,422],{"class":337},[275,3830,3831],{"class":401}," create_oidc_validator",[275,3833,799],{"class":337},[275,3835,3836,3839,3842,3844],{"class":277,"line":383},[275,3837,3838],{"class":337},"    \"",[275,3840,3841],{"class":285},"https:\u002F\u002Fcloud.google.com\u002Fiap",[275,3843,408],{"class":337},[275,3845,2440],{"class":337},[275,3847,3848,3850,3853,3855],{"class":277,"line":389},[275,3849,3838],{"class":337},[275,3851,3852],{"class":285},"\u002Fprojects\u002FPROJECT_NUMBER\u002Fglobal\u002FbackendServices\u002FSERVICE_ID",[275,3854,408],{"class":337},[275,3856,2440],{"class":337},[275,3858,3859,3862,3865,3867,3870,3872],{"class":277,"line":395},[275,3860,3861],{"class":418},"    algorithms",[275,3863,3864],{"class":337},"=(",[275,3866,408],{"class":337},[275,3868,3869],{"class":285},"ES256",[275,3871,408],{"class":337},[275,3873,3874],{"class":337},",),\n",[275,3876,3877,3880,3882,3885],{"class":277,"line":435},[275,3878,3879],{"class":418},"    jwks_cache_ttl",[275,3881,422],{"class":337},[275,3883,3884],{"class":497},"1800",[275,3886,2440],{"class":337},[275,3888,3889],{"class":277,"line":466},[275,3890,432],{"class":337},[89,3892,3894],{"id":3893},"development","Development",[266,3896,3898],{"className":268,"code":3897,"language":270,"meta":271,"style":271},"# Clone the repository\ngit clone https:\u002F\u002Fgithub.com\u002Flitestar-org\u002Flitestar-mcp.git\ncd litestar-mcp\n\n# Install with development dependencies\nuv sync --all-extras --dev\n\n# Run tests\nmake test\n\n# Run example\nuv run python docs\u002Fexamples\u002Fhello_world\u002Fmain.py\n",[97,3899,3900,3905,3916,3923,3927,3932,3945,3949,3954,3962,3966,3971],{"__ignoreMap":271},[275,3901,3902],{"class":277,"line":278},[275,3903,3904],{"class":295},"# Clone the repository\n",[275,3906,3907,3910,3913],{"class":277,"line":292},[275,3908,3909],{"class":281},"git",[275,3911,3912],{"class":285}," clone",[275,3914,3915],{"class":285}," https:\u002F\u002Fgithub.com\u002Flitestar-org\u002Flitestar-mcp.git\n",[275,3917,3918,3921],{"class":277,"line":299},[275,3919,3920],{"class":401},"cd",[275,3922,289],{"class":285},[275,3924,3925],{"class":277,"line":383},[275,3926,386],{"emptyLinePlaceholder":31},[275,3928,3929],{"class":277,"line":389},[275,3930,3931],{"class":295},"# Install with development dependencies\n",[275,3933,3934,3936,3939,3942],{"class":277,"line":395},[275,3935,302],{"class":281},[275,3937,3938],{"class":285}," sync",[275,3940,3941],{"class":285}," --all-extras",[275,3943,3944],{"class":285}," --dev\n",[275,3946,3947],{"class":277,"line":435},[275,3948,386],{"emptyLinePlaceholder":31},[275,3950,3951],{"class":277,"line":466},[275,3952,3953],{"class":295},"# Run tests\n",[275,3955,3956,3959],{"class":277,"line":478},[275,3957,3958],{"class":281},"make",[275,3960,3961],{"class":285}," test\n",[275,3963,3964],{"class":277,"line":557},[275,3965,386],{"emptyLinePlaceholder":31},[275,3967,3968],{"class":277,"line":562},[275,3969,3970],{"class":295},"# Run example\n",[275,3972,3973,3975,3978,3981],{"class":277,"line":44},[275,3974,302],{"class":281},[275,3976,3977],{"class":285}," run",[275,3979,3980],{"class":285}," python",[275,3982,3983],{"class":285}," docs\u002Fexamples\u002Fhello_world\u002Fmain.py\n",[89,3985,86],{"id":3986},"license",[57,3988,3989,3990,3993],{},"MIT License. See ",[63,3991,3992],{"href":3992},"LICENSE"," for details.",[89,3995,3997],{"id":3996},"contributing","Contributing",[57,3999,4000,4001,3993],{},"Contributions welcome! Please see our ",[63,4002,4004],{"href":4003},"docs\u002Fcontribution-guide.rst","contribution guide",[4006,4007,4008],"style",{},"html pre.shiki code .s52Pk, html code.shiki .s52Pk{--shiki-light:#E2931D;--shiki-default:#E2931D;--shiki-dark:#FFCB6B}html pre.shiki code .sGFVr, html code.shiki .sGFVr{--shiki-light:#91B859;--shiki-default:#91B859;--shiki-dark:#C3E88D}html pre.shiki code .sWuyu, html code.shiki .sWuyu{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .s8R28, html code.shiki .s8R28{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#39ADB5;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sZSNi, html code.shiki .sZSNi{--shiki-light:#90A4AE;--shiki-default:#90A4AE;--shiki-dark:#BABED8}html pre.shiki code .sDfIl, html code.shiki .sDfIl{--shiki-light:#39ADB5;--shiki-default:#39ADB5;--shiki-dark:#89DDFF}html pre.shiki code .s3cPz, html code.shiki .s3cPz{--shiki-light:#6182B8;--shiki-default:#6182B8;--shiki-dark:#82AAFF}html pre.shiki code .s1nJG, html code.shiki .s1nJG{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .smZ93, html code.shiki .smZ93{--shiki-light:#9C3EDA;--shiki-default:#9C3EDA;--shiki-dark:#C792EA}html pre.shiki code .sYRBq, html code.shiki .sYRBq{--shiki-light:#F76D47;--shiki-default:#F76D47;--shiki-dark:#F78C6C}html pre.shiki code .sRlkE, html code.shiki .sRlkE{--shiki-light:#E53935;--shiki-default:#E53935;--shiki-dark:#F07178}",{"title":271,"searchDepth":292,"depth":292,"links":4010},[4011,4012,4013,4019,4025,4026,4027,4028,4029,4034,4035,4036],{"id":91,"depth":292,"text":92},{"id":131,"depth":292,"text":132},{"id":258,"depth":292,"text":259,"children":4014},[4015,4016,4017,4018],{"id":263,"depth":299,"text":264},{"id":310,"depth":299,"text":311},{"id":885,"depth":299,"text":886},{"id":1142,"depth":299,"text":1143},{"id":1321,"depth":292,"text":1322,"children":4020},[4021,4023],{"id":1325,"depth":299,"text":4022},"Use Resources (mcp_resource) for",{"id":1574,"depth":299,"text":4024},"Use Tools (mcp_tool) for",{"id":1840,"depth":292,"text":1841},{"id":1884,"depth":292,"text":1885},{"id":1956,"depth":292,"text":1957},{"id":2284,"depth":292,"text":2285},{"id":3354,"depth":292,"text":3355,"children":4030},[4031,4032,4033],{"id":3372,"depth":299,"text":3373},{"id":3500,"depth":299,"text":3501},{"id":3791,"depth":299,"text":3792},{"id":3893,"depth":292,"text":3894},{"id":3986,"depth":292,"text":86},{"id":3996,"depth":292,"text":3997},"readmes\u002Flitestar-mcp","qS4AfSrSMDWbsAgpwXinhaUwNc12VgVy3aDbwIJSB1g",1785155663549]