[{"data":1,"prerenderedAt":2188},["ShallowReactive",2],{"docs-/docs/guides/mcp":3,"docs-/docs/guides/mcp-surround":2139,"docs-navigation":2144},{"id":4,"title":5,"body":6,"description":2130,"extension":2131,"icon":2132,"meta":2133,"navigation":2134,"path":2135,"seo":2136,"stem":2137,"wip":2134,"__hash__":2138},"docs/docs/3.guides/2.mcp.md","MCP Server",{"type":7,"value":8,"toc":2104},"minimark",[9,12,17,31,34,38,41,53,57,115,119,123,126,132,137,284,288,291,338,344,348,415,423,427,432,436,487,512,516,519,523,551,555,863,873,973,977,984,992,1003,1067,1073,1239,1242,1396,1401,1555,1559,1568,1573,1579,1584,1612,1619,1623,1960,2006,2010,2033,2049,2053,2088,2100],[10,11],"landing-mcp-demo",{},[13,14,16],"h2",{"id":15},"overview","Overview",[18,19,20,21,25,26,30],"p",{},"Keystone exposes its project intelligence as a ",[22,23,24],"strong",{},"remote MCP (Model Context Protocol) server",". Any MCP-compatible client (Claude Code, Cursor, Zed, Claude Desktop) can query your project's memory mid-reasoning, ",[27,28,29],"em",{},"before"," writing or reviewing code.",[18,32,33],{},"No local installation required. Clients connect with a single API key and a URL.",[13,35,37],{"id":36},"how-it-works","How it works",[39,40],"mcp-flow-diagram",{},[18,42,43,44,48,49,52],{},"The agent calls ",[45,46,47],"code",{},"list_projects"," to discover slugs, then calls ",[45,50,51],{},"ask"," with one or more slugs and a question. Keystone searches its vector embeddings (commits, PRs, issues, READMEs), optionally reads live files from GitHub, and returns a Markdown answer with cited sources. The agent uses this context to make better decisions before touching any code.",[13,54,56],{"id":55},"quick-start","Quick start",[58,59,60,65,86,90,97,101],"steps",{},[61,62,64],"h3",{"id":63},"generate-an-api-key","Generate an API key",[18,66,67,68,73,74,77,78,81,82,85],{},"Open ",[69,70,72],"a",{"href":71},"/settings","Settings → API Keys"," in the dashboard, click ",[22,75,76],{},"New key",", give it a name (e.g. ",[45,79,80],{},"Claude Code – MacBook","), and copy the token. The full token is shown ",[22,83,84],{},"only once",".",[61,87,89],{"id":88},"add-keystone-to-your-ide","Add Keystone to your IDE",[18,91,92,93,96],{},"Pick the snippet for your IDE below and paste it into the relevant config file, replacing ",[45,94,95],{},"ks_live_\u003Cyour-token>"," with the key you just generated.",[61,98,100],{"id":99},"restart-and-verify","Restart and verify",[18,102,103,104,106,107,106,109,106,112,85],{},"Restart your IDE so it picks up the new server. Your agent should now show four Keystone tools available: ",[45,105,47],{},", ",[45,108,51],{},[45,110,111],{},"search_memory",[45,113,114],{},"get_project_status",[13,116,118],{"id":117},"available-tools","Available tools",[61,120,121],{"id":47},[45,122,47],{},[18,124,125],{},"Lists every project in your organization with its current sync and synthesis status. Agents typically call this first to discover the project slugs they can use in other tools.",[18,127,128,131],{},[22,129,130],{},"Inputs:"," none",[18,133,134],{},[22,135,136],{},"Output:",[138,139,144],"pre",{"className":140,"code":141,"language":142,"meta":143,"style":143},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\n  {\n    \"slug\": \"my-api\",\n    \"name\": \"My API\",\n    \"githubFullName\": \"org/my-api\",\n    \"synthesisStatus\": \"completed\",\n    \"lastSyncedAt\": \"2026-04-29T10:00:00.000Z\"\n  }\n]\n","json","",[45,145,146,155,161,189,210,231,252,272,278],{"__ignoreMap":143},[147,148,151],"span",{"class":149,"line":150},"line",1,[147,152,154],{"class":153},"sMK4o","[\n",[147,156,158],{"class":149,"line":157},2,[147,159,160],{"class":153},"  {\n",[147,162,164,167,171,174,177,180,184,186],{"class":149,"line":163},3,[147,165,166],{"class":153},"    \"",[147,168,170],{"class":169},"spNyl","slug",[147,172,173],{"class":153},"\"",[147,175,176],{"class":153},":",[147,178,179],{"class":153}," \"",[147,181,183],{"class":182},"sfazB","my-api",[147,185,173],{"class":153},[147,187,188],{"class":153},",\n",[147,190,192,194,197,199,201,203,206,208],{"class":149,"line":191},4,[147,193,166],{"class":153},[147,195,196],{"class":169},"name",[147,198,173],{"class":153},[147,200,176],{"class":153},[147,202,179],{"class":153},[147,204,205],{"class":182},"My API",[147,207,173],{"class":153},[147,209,188],{"class":153},[147,211,213,215,218,220,222,224,227,229],{"class":149,"line":212},5,[147,214,166],{"class":153},[147,216,217],{"class":169},"githubFullName",[147,219,173],{"class":153},[147,221,176],{"class":153},[147,223,179],{"class":153},[147,225,226],{"class":182},"org/my-api",[147,228,173],{"class":153},[147,230,188],{"class":153},[147,232,234,236,239,241,243,245,248,250],{"class":149,"line":233},6,[147,235,166],{"class":153},[147,237,238],{"class":169},"synthesisStatus",[147,240,173],{"class":153},[147,242,176],{"class":153},[147,244,179],{"class":153},[147,246,247],{"class":182},"completed",[147,249,173],{"class":153},[147,251,188],{"class":153},[147,253,255,257,260,262,264,266,269],{"class":149,"line":254},7,[147,256,166],{"class":153},[147,258,259],{"class":169},"lastSyncedAt",[147,261,173],{"class":153},[147,263,176],{"class":153},[147,265,179],{"class":153},[147,267,268],{"class":182},"2026-04-29T10:00:00.000Z",[147,270,271],{"class":153},"\"\n",[147,273,275],{"class":149,"line":274},8,[147,276,277],{"class":153},"  }\n",[147,279,281],{"class":149,"line":280},9,[147,282,283],{"class":153},"]\n",[61,285,286],{"id":51},[45,287,51],{},[18,289,290],{},"The core tool. Asks a question about one or more projects using Keystone's full intelligence pipeline:",[292,293,294,309,315,325],"ol",{},[295,296,297,300,301,304,305,308],"li",{},[22,298,299],{},"Semantic search"," over ",[45,302,303],{},"pgvector"," embeddings of PRs, commits, issues, and READMEs (Mistral ",[45,306,307],{},"codestral-embed-2505",")",[295,310,311,314],{},[22,312,313],{},"Live file access"," via the GitHub API; the agent can browse the repo tree and read specific files",[295,316,317,320,321,324],{},[22,318,319],{},"LLM synthesis"," with Mistral ",[45,322,323],{},"devstral-small-latest",", constrained to cite sources and respond in Markdown",[295,326,327,330,331,334,335],{},[22,328,329],{},"Usage logged"," to ",[45,332,333],{},"ChatUsageLog"," with ",[45,336,337],{},"source: 'mcp'",[18,339,340,341,343],{},"Unlike the web chat, ",[45,342,51],{}," is non-streaming; it returns the complete answer once finished. This is intentional: MCP tool calls are synchronous from the agent's perspective.",[18,345,346],{},[22,347,130],{},[138,349,351],{"className":140,"code":350,"language":142,"meta":143,"style":143},"{\n  \"projectSlugs\": [\"my-api\", \"my-frontend\"],\n  \"question\": \"What architectural pattern is used for state management?\"\n}\n",[45,352,353,358,392,410],{"__ignoreMap":143},[147,354,355],{"class":149,"line":150},[147,356,357],{"class":153},"{\n",[147,359,360,363,366,368,370,373,375,377,379,382,384,387,389],{"class":149,"line":157},[147,361,362],{"class":153},"  \"",[147,364,365],{"class":169},"projectSlugs",[147,367,173],{"class":153},[147,369,176],{"class":153},[147,371,372],{"class":153}," [",[147,374,173],{"class":153},[147,376,183],{"class":182},[147,378,173],{"class":153},[147,380,381],{"class":153},",",[147,383,179],{"class":153},[147,385,386],{"class":182},"my-frontend",[147,388,173],{"class":153},[147,390,391],{"class":153},"],\n",[147,393,394,396,399,401,403,405,408],{"class":149,"line":163},[147,395,362],{"class":153},[147,397,398],{"class":169},"question",[147,400,173],{"class":153},[147,402,176],{"class":153},[147,404,179],{"class":153},[147,406,407],{"class":182},"What architectural pattern is used for state management?",[147,409,271],{"class":153},[147,411,412],{"class":149,"line":191},[147,413,414],{"class":153},"}\n",[18,416,417,419,420],{},[22,418,136],{}," ",[45,421,422],{},"[{ \"type\": \"text\", \"text\": \"\u003CMarkdown answer with citations>\" }]",[61,424,425],{"id":111},[45,426,111],{},[18,428,429,430,85],{},"Returns raw matching chunks from the knowledge base, with no LLM involved. Useful when your own model wants to interpret the results, or when you want to inspect the context Keystone would feed into ",[45,431,51],{},[18,433,434],{},[22,435,130],{},[138,437,439],{"className":140,"code":438,"language":142,"meta":143,"style":143},"{\n  \"projectSlugs\": [\"my-api\"],\n  \"query\": \"how authentication tokens are issued\"\n}\n",[45,440,441,445,465,483],{"__ignoreMap":143},[147,442,443],{"class":149,"line":150},[147,444,357],{"class":153},[147,446,447,449,451,453,455,457,459,461,463],{"class":149,"line":157},[147,448,362],{"class":153},[147,450,365],{"class":169},[147,452,173],{"class":153},[147,454,176],{"class":153},[147,456,372],{"class":153},[147,458,173],{"class":153},[147,460,183],{"class":182},[147,462,173],{"class":153},[147,464,391],{"class":153},[147,466,467,469,472,474,476,478,481],{"class":149,"line":163},[147,468,362],{"class":153},[147,470,471],{"class":169},"query",[147,473,173],{"class":153},[147,475,176],{"class":153},[147,477,179],{"class":153},[147,479,480],{"class":182},"how authentication tokens are issued",[147,482,271],{"class":153},[147,484,485],{"class":149,"line":191},[147,486,414],{"class":153},[18,488,489,491,492,106,495,106,498,106,501,504,505,508,509,85],{},[22,490,136],{}," an array of matches, each with ",[45,493,494],{},"repo",[45,496,497],{},"sourceId",[45,499,500],{},"content",[45,502,503],{},"metadata",", and ",[45,506,507],{},"similarity"," (0–1). Top 12 results above similarity ",[45,510,511],{},"0.3",[61,513,514],{"id":114},[45,515,114],{},[18,517,518],{},"Returns the memory score and pipeline status for a single project. Useful for the agent to verify that a project has been ingested and synthesized before querying it.",[18,520,521],{},[22,522,130],{},[138,524,526],{"className":140,"code":525,"language":142,"meta":143,"style":143},"{ \"projectSlug\": \"my-api\" }\n",[45,527,528],{"__ignoreMap":143},[147,529,530,533,535,538,540,542,544,546,548],{"class":149,"line":150},[147,531,532],{"class":153},"{",[147,534,179],{"class":153},[147,536,537],{"class":169},"projectSlug",[147,539,173],{"class":153},[147,541,176],{"class":153},[147,543,179],{"class":153},[147,545,183],{"class":182},[147,547,173],{"class":153},[147,549,550],{"class":153}," }\n",[18,552,553],{},[22,554,136],{},[138,556,558],{"className":140,"code":557,"language":142,"meta":143,"style":143},"{\n  \"slug\": \"my-api\",\n  \"githubFullName\": \"org/my-api\",\n  \"memoryScore\": 92,\n  \"breakdown\": {\n    \"total\": 92,\n    \"ingestion\": 25,\n    \"synthesis\": 25,\n    \"coverage\": 25,\n    \"freshness\": 15,\n    \"keystoneFolder\": 10\n  },\n  \"synthesisStatus\": \"completed\",\n  \"synthesisProgress\": 100,\n  \"lastSyncedAt\": \"2026-04-29T10:00:00.000Z\",\n  \"ingestionCompleted\": true,\n  \"embeddingCount\": 318,\n  \"keystoneFolder\": { \"detected\": true, \"fileCount\": 6 }\n}\n",[45,559,560,564,582,600,617,631,647,663,678,693,710,725,731,750,767,786,801,818,858],{"__ignoreMap":143},[147,561,562],{"class":149,"line":150},[147,563,357],{"class":153},[147,565,566,568,570,572,574,576,578,580],{"class":149,"line":157},[147,567,362],{"class":153},[147,569,170],{"class":169},[147,571,173],{"class":153},[147,573,176],{"class":153},[147,575,179],{"class":153},[147,577,183],{"class":182},[147,579,173],{"class":153},[147,581,188],{"class":153},[147,583,584,586,588,590,592,594,596,598],{"class":149,"line":163},[147,585,362],{"class":153},[147,587,217],{"class":169},[147,589,173],{"class":153},[147,591,176],{"class":153},[147,593,179],{"class":153},[147,595,226],{"class":182},[147,597,173],{"class":153},[147,599,188],{"class":153},[147,601,602,604,607,609,611,615],{"class":149,"line":191},[147,603,362],{"class":153},[147,605,606],{"class":169},"memoryScore",[147,608,173],{"class":153},[147,610,176],{"class":153},[147,612,614],{"class":613},"sbssI"," 92",[147,616,188],{"class":153},[147,618,619,621,624,626,628],{"class":149,"line":212},[147,620,362],{"class":153},[147,622,623],{"class":169},"breakdown",[147,625,173],{"class":153},[147,627,176],{"class":153},[147,629,630],{"class":153}," {\n",[147,632,633,635,639,641,643,645],{"class":149,"line":233},[147,634,166],{"class":153},[147,636,638],{"class":637},"sBMFI","total",[147,640,173],{"class":153},[147,642,176],{"class":153},[147,644,614],{"class":613},[147,646,188],{"class":153},[147,648,649,651,654,656,658,661],{"class":149,"line":254},[147,650,166],{"class":153},[147,652,653],{"class":637},"ingestion",[147,655,173],{"class":153},[147,657,176],{"class":153},[147,659,660],{"class":613}," 25",[147,662,188],{"class":153},[147,664,665,667,670,672,674,676],{"class":149,"line":274},[147,666,166],{"class":153},[147,668,669],{"class":637},"synthesis",[147,671,173],{"class":153},[147,673,176],{"class":153},[147,675,660],{"class":613},[147,677,188],{"class":153},[147,679,680,682,685,687,689,691],{"class":149,"line":280},[147,681,166],{"class":153},[147,683,684],{"class":637},"coverage",[147,686,173],{"class":153},[147,688,176],{"class":153},[147,690,660],{"class":613},[147,692,188],{"class":153},[147,694,696,698,701,703,705,708],{"class":149,"line":695},10,[147,697,166],{"class":153},[147,699,700],{"class":637},"freshness",[147,702,173],{"class":153},[147,704,176],{"class":153},[147,706,707],{"class":613}," 15",[147,709,188],{"class":153},[147,711,713,715,718,720,722],{"class":149,"line":712},11,[147,714,166],{"class":153},[147,716,717],{"class":637},"keystoneFolder",[147,719,173],{"class":153},[147,721,176],{"class":153},[147,723,724],{"class":613}," 10\n",[147,726,728],{"class":149,"line":727},12,[147,729,730],{"class":153},"  },\n",[147,732,734,736,738,740,742,744,746,748],{"class":149,"line":733},13,[147,735,362],{"class":153},[147,737,238],{"class":169},[147,739,173],{"class":153},[147,741,176],{"class":153},[147,743,179],{"class":153},[147,745,247],{"class":182},[147,747,173],{"class":153},[147,749,188],{"class":153},[147,751,753,755,758,760,762,765],{"class":149,"line":752},14,[147,754,362],{"class":153},[147,756,757],{"class":169},"synthesisProgress",[147,759,173],{"class":153},[147,761,176],{"class":153},[147,763,764],{"class":613}," 100",[147,766,188],{"class":153},[147,768,770,772,774,776,778,780,782,784],{"class":149,"line":769},15,[147,771,362],{"class":153},[147,773,259],{"class":169},[147,775,173],{"class":153},[147,777,176],{"class":153},[147,779,179],{"class":153},[147,781,268],{"class":182},[147,783,173],{"class":153},[147,785,188],{"class":153},[147,787,789,791,794,796,798],{"class":149,"line":788},16,[147,790,362],{"class":153},[147,792,793],{"class":169},"ingestionCompleted",[147,795,173],{"class":153},[147,797,176],{"class":153},[147,799,800],{"class":153}," true,\n",[147,802,804,806,809,811,813,816],{"class":149,"line":803},17,[147,805,362],{"class":153},[147,807,808],{"class":169},"embeddingCount",[147,810,173],{"class":153},[147,812,176],{"class":153},[147,814,815],{"class":613}," 318",[147,817,188],{"class":153},[147,819,821,823,825,827,829,832,834,837,839,841,844,846,849,851,853,856],{"class":149,"line":820},18,[147,822,362],{"class":153},[147,824,717],{"class":169},[147,826,173],{"class":153},[147,828,176],{"class":153},[147,830,831],{"class":153}," {",[147,833,179],{"class":153},[147,835,836],{"class":637},"detected",[147,838,173],{"class":153},[147,840,176],{"class":153},[147,842,843],{"class":153}," true,",[147,845,179],{"class":153},[147,847,848],{"class":637},"fileCount",[147,850,173],{"class":153},[147,852,176],{"class":153},[147,854,855],{"class":613}," 6",[147,857,550],{"class":153},[147,859,861],{"class":149,"line":860},19,[147,862,414],{"class":153},[18,864,865,868,869,872],{},[22,866,867],{},"Memory score"," breakdown (max ",[45,870,871],{},"100","):",[874,875,876,888,897,931,964],"ul",{},[295,877,878,881,882,334,885,85],{},[22,879,880],{},"Ingestion (25)"," — at least one ",[45,883,884],{},"SyncLog",[45,886,887],{},"status: \"COMPLETED\"",[295,889,890,893,894,85],{},[22,891,892],{},"Synthesis (25)"," — ",[45,895,896],{},"synthesisStatus === \"completed\"",[295,898,899,902,903,906,907,910,911,106,913,910,916,106,919,910,922,106,925,910,928,85],{},[22,900,901],{},"Coverage (25)"," — based on number of ",[45,904,905],{},"ProjectEmbedding"," rows: ",[45,908,909],{},"0"," → ",[45,912,909],{},[45,914,915],{},"1–49",[45,917,918],{},"8",[45,920,921],{},"50–199",[45,923,924],{},"17",[45,926,927],{},"200+",[45,929,930],{},"25",[295,932,933,936,937,939,940,910,943,106,946,910,949,106,952,910,955,958,959,910,962,85],{},[22,934,935],{},"Freshness (15)"," — age of ",[45,938,259],{},": ",[45,941,942],{},"≤7d",[45,944,945],{},"15",[45,947,948],{},"≤30d",[45,950,951],{},"10",[45,953,954],{},"≤90d",[45,956,957],{},"5",", older or ",[45,960,961],{},"null",[45,963,909],{},[295,965,966,972],{},[22,967,968,971],{},[45,969,970],{},".keystone"," folder (10)"," — detected in the repo tree.",[13,974,976],{"id":975},"protocol","Protocol",[18,978,979,980,983],{},"The server implements the ",[22,981,982],{},"MCP Streamable HTTP transport"," over a single endpoint:",[138,985,990],{"className":986,"code":988,"language":989,"meta":143},[987],"language-text","POST /api/mcp\n","text",[45,991,988],{"__ignoreMap":143},[18,993,994,995,998,999,1002],{},"All requests and responses use ",[22,996,997],{},"JSON-RPC 2.0"," (protocol version ",[45,1000,1001],{},"2025-03-26","). The server handles four method types:",[1004,1005,1006,1019],"table",{},[1007,1008,1009],"thead",{},[1010,1011,1012,1016],"tr",{},[1013,1014,1015],"th",{},"Method",[1013,1017,1018],{},"Description",[1020,1021,1022,1033,1043,1053],"tbody",{},[1010,1023,1024,1030],{},[1025,1026,1027],"td",{},[45,1028,1029],{},"initialize",[1025,1031,1032],{},"Handshake; client sends capabilities, server replies with its own",[1010,1034,1035,1040],{},[1025,1036,1037],{},[45,1038,1039],{},"tools/list",[1025,1041,1042],{},"Returns the list of available tools with their JSON schemas",[1010,1044,1045,1050],{},[1025,1046,1047],{},[45,1048,1049],{},"tools/call",[1025,1051,1052],{},"Executes a tool and returns the result",[1010,1054,1055,1060],{},[1025,1056,1057],{},[45,1058,1059],{},"notifications/initialized",[1025,1061,1062,1063,1066],{},"Client acknowledgement after init; server replies ",[45,1064,1065],{},"202",", no body",[61,1068,1070,1071],{"id":1069},"example-initialize","Example: ",[45,1072,1029],{},[138,1074,1076],{"className":140,"code":1075,"language":142,"meta":143,"style":143},"{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"initialize\",\n  \"params\": {\n    \"protocolVersion\": \"2025-03-26\",\n    \"capabilities\": {},\n    \"clientInfo\": { \"name\": \"claude-code\", \"version\": \"1.0\" }\n  }\n}\n",[45,1077,1078,1082,1102,1118,1137,1150,1169,1183,1231,1235],{"__ignoreMap":143},[147,1079,1080],{"class":149,"line":150},[147,1081,357],{"class":153},[147,1083,1084,1086,1089,1091,1093,1095,1098,1100],{"class":149,"line":157},[147,1085,362],{"class":153},[147,1087,1088],{"class":169},"jsonrpc",[147,1090,173],{"class":153},[147,1092,176],{"class":153},[147,1094,179],{"class":153},[147,1096,1097],{"class":182},"2.0",[147,1099,173],{"class":153},[147,1101,188],{"class":153},[147,1103,1104,1106,1109,1111,1113,1116],{"class":149,"line":163},[147,1105,362],{"class":153},[147,1107,1108],{"class":169},"id",[147,1110,173],{"class":153},[147,1112,176],{"class":153},[147,1114,1115],{"class":613}," 1",[147,1117,188],{"class":153},[147,1119,1120,1122,1125,1127,1129,1131,1133,1135],{"class":149,"line":191},[147,1121,362],{"class":153},[147,1123,1124],{"class":169},"method",[147,1126,173],{"class":153},[147,1128,176],{"class":153},[147,1130,179],{"class":153},[147,1132,1029],{"class":182},[147,1134,173],{"class":153},[147,1136,188],{"class":153},[147,1138,1139,1141,1144,1146,1148],{"class":149,"line":212},[147,1140,362],{"class":153},[147,1142,1143],{"class":169},"params",[147,1145,173],{"class":153},[147,1147,176],{"class":153},[147,1149,630],{"class":153},[147,1151,1152,1154,1157,1159,1161,1163,1165,1167],{"class":149,"line":233},[147,1153,166],{"class":153},[147,1155,1156],{"class":637},"protocolVersion",[147,1158,173],{"class":153},[147,1160,176],{"class":153},[147,1162,179],{"class":153},[147,1164,1001],{"class":182},[147,1166,173],{"class":153},[147,1168,188],{"class":153},[147,1170,1171,1173,1176,1178,1180],{"class":149,"line":254},[147,1172,166],{"class":153},[147,1174,1175],{"class":637},"capabilities",[147,1177,173],{"class":153},[147,1179,176],{"class":153},[147,1181,1182],{"class":153}," {},\n",[147,1184,1185,1187,1190,1192,1194,1196,1198,1200,1202,1204,1206,1209,1211,1213,1215,1218,1220,1222,1224,1227,1229],{"class":149,"line":274},[147,1186,166],{"class":153},[147,1188,1189],{"class":637},"clientInfo",[147,1191,173],{"class":153},[147,1193,176],{"class":153},[147,1195,831],{"class":153},[147,1197,179],{"class":153},[147,1199,196],{"class":613},[147,1201,173],{"class":153},[147,1203,176],{"class":153},[147,1205,179],{"class":153},[147,1207,1208],{"class":182},"claude-code",[147,1210,173],{"class":153},[147,1212,381],{"class":153},[147,1214,179],{"class":153},[147,1216,1217],{"class":613},"version",[147,1219,173],{"class":153},[147,1221,176],{"class":153},[147,1223,179],{"class":153},[147,1225,1226],{"class":182},"1.0",[147,1228,173],{"class":153},[147,1230,550],{"class":153},[147,1232,1233],{"class":149,"line":280},[147,1234,277],{"class":153},[147,1236,1237],{"class":149,"line":695},[147,1238,414],{"class":153},[18,1240,1241],{},"Response:",[138,1243,1245],{"className":140,"code":1244,"language":142,"meta":143,"style":143},"{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"protocolVersion\": \"2025-03-26\",\n    \"capabilities\": { \"tools\": {} },\n    \"serverInfo\": { \"name\": \"keystone\", \"version\": \"1.0.0\" }\n  }\n}\n",[45,1246,1247,1251,1269,1283,1296,1314,1341,1388,1392],{"__ignoreMap":143},[147,1248,1249],{"class":149,"line":150},[147,1250,357],{"class":153},[147,1252,1253,1255,1257,1259,1261,1263,1265,1267],{"class":149,"line":157},[147,1254,362],{"class":153},[147,1256,1088],{"class":169},[147,1258,173],{"class":153},[147,1260,176],{"class":153},[147,1262,179],{"class":153},[147,1264,1097],{"class":182},[147,1266,173],{"class":153},[147,1268,188],{"class":153},[147,1270,1271,1273,1275,1277,1279,1281],{"class":149,"line":163},[147,1272,362],{"class":153},[147,1274,1108],{"class":169},[147,1276,173],{"class":153},[147,1278,176],{"class":153},[147,1280,1115],{"class":613},[147,1282,188],{"class":153},[147,1284,1285,1287,1290,1292,1294],{"class":149,"line":191},[147,1286,362],{"class":153},[147,1288,1289],{"class":169},"result",[147,1291,173],{"class":153},[147,1293,176],{"class":153},[147,1295,630],{"class":153},[147,1297,1298,1300,1302,1304,1306,1308,1310,1312],{"class":149,"line":212},[147,1299,166],{"class":153},[147,1301,1156],{"class":637},[147,1303,173],{"class":153},[147,1305,176],{"class":153},[147,1307,179],{"class":153},[147,1309,1001],{"class":182},[147,1311,173],{"class":153},[147,1313,188],{"class":153},[147,1315,1316,1318,1320,1322,1324,1326,1328,1331,1333,1335,1338],{"class":149,"line":233},[147,1317,166],{"class":153},[147,1319,1175],{"class":637},[147,1321,173],{"class":153},[147,1323,176],{"class":153},[147,1325,831],{"class":153},[147,1327,179],{"class":153},[147,1329,1330],{"class":613},"tools",[147,1332,173],{"class":153},[147,1334,176],{"class":153},[147,1336,1337],{"class":153}," {}",[147,1339,1340],{"class":153}," },\n",[147,1342,1343,1345,1348,1350,1352,1354,1356,1358,1360,1362,1364,1367,1369,1371,1373,1375,1377,1379,1381,1384,1386],{"class":149,"line":254},[147,1344,166],{"class":153},[147,1346,1347],{"class":637},"serverInfo",[147,1349,173],{"class":153},[147,1351,176],{"class":153},[147,1353,831],{"class":153},[147,1355,179],{"class":153},[147,1357,196],{"class":613},[147,1359,173],{"class":153},[147,1361,176],{"class":153},[147,1363,179],{"class":153},[147,1365,1366],{"class":182},"keystone",[147,1368,173],{"class":153},[147,1370,381],{"class":153},[147,1372,179],{"class":153},[147,1374,1217],{"class":613},[147,1376,173],{"class":153},[147,1378,176],{"class":153},[147,1380,179],{"class":153},[147,1382,1383],{"class":182},"1.0.0",[147,1385,173],{"class":153},[147,1387,550],{"class":153},[147,1389,1390],{"class":149,"line":274},[147,1391,277],{"class":153},[147,1393,1394],{"class":149,"line":280},[147,1395,414],{"class":153},[61,1397,1070,1399],{"id":1398},"example-toolscall",[45,1400,1049],{},[138,1402,1404],{"className":140,"code":1403,"language":142,"meta":143,"style":143},"{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 3,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"ask\",\n    \"arguments\": {\n      \"projectSlugs\": [\"my-api\"],\n      \"question\": \"How is authentication implemented?\"\n    }\n  }\n}\n",[45,1405,1406,1410,1428,1443,1461,1473,1491,1504,1525,1542,1547,1551],{"__ignoreMap":143},[147,1407,1408],{"class":149,"line":150},[147,1409,357],{"class":153},[147,1411,1412,1414,1416,1418,1420,1422,1424,1426],{"class":149,"line":157},[147,1413,362],{"class":153},[147,1415,1088],{"class":169},[147,1417,173],{"class":153},[147,1419,176],{"class":153},[147,1421,179],{"class":153},[147,1423,1097],{"class":182},[147,1425,173],{"class":153},[147,1427,188],{"class":153},[147,1429,1430,1432,1434,1436,1438,1441],{"class":149,"line":163},[147,1431,362],{"class":153},[147,1433,1108],{"class":169},[147,1435,173],{"class":153},[147,1437,176],{"class":153},[147,1439,1440],{"class":613}," 3",[147,1442,188],{"class":153},[147,1444,1445,1447,1449,1451,1453,1455,1457,1459],{"class":149,"line":191},[147,1446,362],{"class":153},[147,1448,1124],{"class":169},[147,1450,173],{"class":153},[147,1452,176],{"class":153},[147,1454,179],{"class":153},[147,1456,1049],{"class":182},[147,1458,173],{"class":153},[147,1460,188],{"class":153},[147,1462,1463,1465,1467,1469,1471],{"class":149,"line":212},[147,1464,362],{"class":153},[147,1466,1143],{"class":169},[147,1468,173],{"class":153},[147,1470,176],{"class":153},[147,1472,630],{"class":153},[147,1474,1475,1477,1479,1481,1483,1485,1487,1489],{"class":149,"line":233},[147,1476,166],{"class":153},[147,1478,196],{"class":637},[147,1480,173],{"class":153},[147,1482,176],{"class":153},[147,1484,179],{"class":153},[147,1486,51],{"class":182},[147,1488,173],{"class":153},[147,1490,188],{"class":153},[147,1492,1493,1495,1498,1500,1502],{"class":149,"line":254},[147,1494,166],{"class":153},[147,1496,1497],{"class":637},"arguments",[147,1499,173],{"class":153},[147,1501,176],{"class":153},[147,1503,630],{"class":153},[147,1505,1506,1509,1511,1513,1515,1517,1519,1521,1523],{"class":149,"line":274},[147,1507,1508],{"class":153},"      \"",[147,1510,365],{"class":613},[147,1512,173],{"class":153},[147,1514,176],{"class":153},[147,1516,372],{"class":153},[147,1518,173],{"class":153},[147,1520,183],{"class":182},[147,1522,173],{"class":153},[147,1524,391],{"class":153},[147,1526,1527,1529,1531,1533,1535,1537,1540],{"class":149,"line":280},[147,1528,1508],{"class":153},[147,1530,398],{"class":613},[147,1532,173],{"class":153},[147,1534,176],{"class":153},[147,1536,179],{"class":153},[147,1538,1539],{"class":182},"How is authentication implemented?",[147,1541,271],{"class":153},[147,1543,1544],{"class":149,"line":695},[147,1545,1546],{"class":153},"    }\n",[147,1548,1549],{"class":149,"line":712},[147,1550,277],{"class":153},[147,1552,1553],{"class":149,"line":727},[147,1554,414],{"class":153},[13,1556,1558],{"id":1557},"authentication","Authentication",[18,1560,1561,1562,1565,1566,85],{},"MCP clients authenticate using long-lived API keys with the prefix ",[45,1563,1564],{},"ks_live_",". Keys are generated and revoked from ",[69,1567,72],{"href":71},[18,1569,1570],{},[22,1571,1572],{},"Token format:",[138,1574,1577],{"className":1575,"code":1576,"language":989,"meta":143},[987],"ks_live_\u003C64 hex characters>\n",[45,1578,1576],{"__ignoreMap":143},[18,1580,1581],{},[22,1582,1583],{},"Security model:",[874,1585,1586,1593,1603,1606],{},[295,1587,1588,1589,1592],{},"The full token is shown ",[22,1590,1591],{},"once"," at creation time and is never stored in plain text",[295,1594,1595,1596,1599,1600,308],{},"The database stores a ",[45,1597,1598],{},"SHA-256"," hash plus a short prefix for display (e.g. ",[45,1601,1602],{},"ks_live_Ab3x...",[295,1604,1605],{},"On each request, the server hashes the incoming token and looks it up, with no reversible storage",[295,1607,1608,1611],{},[45,1609,1610],{},"lastUsedAt"," is updated on every successful request",[1613,1614,1616],"callout",{"icon":1615},"i-lucide-info",[18,1617,1618],{},"The MCP endpoint also accepts standard Supabase Bearer tokens, so you can call it during local development without generating an API key. The server detects the auth type from the token prefix.",[13,1620,1622],{"id":1621},"ide-setup","IDE setup",[1624,1625,1626,1751,1847],"code-group",{},[138,1627,1630],{"className":140,"code":1628,"filename":1629,"language":142,"meta":143,"style":143},"{\n  \"mcpServers\": {\n    \"keystone\": {\n      \"type\": \"http\",\n      \"url\": \"https://app.keystone.dev/api/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ks_live_\u003Cyour-token>\"\n      }\n    }\n  }\n}\n","Claude Code",[45,1631,1632,1636,1649,1661,1681,1701,1714,1734,1739,1743,1747],{"__ignoreMap":143},[147,1633,1634],{"class":149,"line":150},[147,1635,357],{"class":153},[147,1637,1638,1640,1643,1645,1647],{"class":149,"line":157},[147,1639,362],{"class":153},[147,1641,1642],{"class":169},"mcpServers",[147,1644,173],{"class":153},[147,1646,176],{"class":153},[147,1648,630],{"class":153},[147,1650,1651,1653,1655,1657,1659],{"class":149,"line":163},[147,1652,166],{"class":153},[147,1654,1366],{"class":637},[147,1656,173],{"class":153},[147,1658,176],{"class":153},[147,1660,630],{"class":153},[147,1662,1663,1665,1668,1670,1672,1674,1677,1679],{"class":149,"line":191},[147,1664,1508],{"class":153},[147,1666,1667],{"class":613},"type",[147,1669,173],{"class":153},[147,1671,176],{"class":153},[147,1673,179],{"class":153},[147,1675,1676],{"class":182},"http",[147,1678,173],{"class":153},[147,1680,188],{"class":153},[147,1682,1683,1685,1688,1690,1692,1694,1697,1699],{"class":149,"line":212},[147,1684,1508],{"class":153},[147,1686,1687],{"class":613},"url",[147,1689,173],{"class":153},[147,1691,176],{"class":153},[147,1693,179],{"class":153},[147,1695,1696],{"class":182},"https://app.keystone.dev/api/mcp",[147,1698,173],{"class":153},[147,1700,188],{"class":153},[147,1702,1703,1705,1708,1710,1712],{"class":149,"line":233},[147,1704,1508],{"class":153},[147,1706,1707],{"class":613},"headers",[147,1709,173],{"class":153},[147,1711,176],{"class":153},[147,1713,630],{"class":153},[147,1715,1716,1719,1723,1725,1727,1729,1732],{"class":149,"line":254},[147,1717,1718],{"class":153},"        \"",[147,1720,1722],{"class":1721},"swJcz","Authorization",[147,1724,173],{"class":153},[147,1726,176],{"class":153},[147,1728,179],{"class":153},[147,1730,1731],{"class":182},"Bearer ks_live_\u003Cyour-token>",[147,1733,271],{"class":153},[147,1735,1736],{"class":149,"line":274},[147,1737,1738],{"class":153},"      }\n",[147,1740,1741],{"class":149,"line":280},[147,1742,1546],{"class":153},[147,1744,1745],{"class":149,"line":695},[147,1746,277],{"class":153},[147,1748,1749],{"class":149,"line":712},[147,1750,414],{"class":153},[138,1752,1755],{"className":140,"code":1753,"filename":1754,"language":142,"meta":143,"style":143},"{\n  \"mcpServers\": {\n    \"keystone\": {\n      \"url\": \"https://app.keystone.dev/api/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ks_live_\u003Cyour-token>\"\n      }\n    }\n  }\n}\n","Cursor",[45,1756,1757,1761,1773,1785,1803,1815,1831,1835,1839,1843],{"__ignoreMap":143},[147,1758,1759],{"class":149,"line":150},[147,1760,357],{"class":153},[147,1762,1763,1765,1767,1769,1771],{"class":149,"line":157},[147,1764,362],{"class":153},[147,1766,1642],{"class":169},[147,1768,173],{"class":153},[147,1770,176],{"class":153},[147,1772,630],{"class":153},[147,1774,1775,1777,1779,1781,1783],{"class":149,"line":163},[147,1776,166],{"class":153},[147,1778,1366],{"class":637},[147,1780,173],{"class":153},[147,1782,176],{"class":153},[147,1784,630],{"class":153},[147,1786,1787,1789,1791,1793,1795,1797,1799,1801],{"class":149,"line":191},[147,1788,1508],{"class":153},[147,1790,1687],{"class":613},[147,1792,173],{"class":153},[147,1794,176],{"class":153},[147,1796,179],{"class":153},[147,1798,1696],{"class":182},[147,1800,173],{"class":153},[147,1802,188],{"class":153},[147,1804,1805,1807,1809,1811,1813],{"class":149,"line":212},[147,1806,1508],{"class":153},[147,1808,1707],{"class":613},[147,1810,173],{"class":153},[147,1812,176],{"class":153},[147,1814,630],{"class":153},[147,1816,1817,1819,1821,1823,1825,1827,1829],{"class":149,"line":233},[147,1818,1718],{"class":153},[147,1820,1722],{"class":1721},[147,1822,173],{"class":153},[147,1824,176],{"class":153},[147,1826,179],{"class":153},[147,1828,1731],{"class":182},[147,1830,271],{"class":153},[147,1832,1833],{"class":149,"line":254},[147,1834,1738],{"class":153},[147,1836,1837],{"class":149,"line":274},[147,1838,1546],{"class":153},[147,1840,1841],{"class":149,"line":280},[147,1842,277],{"class":153},[147,1844,1845],{"class":149,"line":695},[147,1846,414],{"class":153},[138,1848,1850],{"className":140,"code":1628,"filename":1849,"language":142,"meta":143,"style":143},"Claude Desktop",[45,1851,1852,1856,1868,1880,1898,1916,1928,1944,1948,1952,1956],{"__ignoreMap":143},[147,1853,1854],{"class":149,"line":150},[147,1855,357],{"class":153},[147,1857,1858,1860,1862,1864,1866],{"class":149,"line":157},[147,1859,362],{"class":153},[147,1861,1642],{"class":169},[147,1863,173],{"class":153},[147,1865,176],{"class":153},[147,1867,630],{"class":153},[147,1869,1870,1872,1874,1876,1878],{"class":149,"line":163},[147,1871,166],{"class":153},[147,1873,1366],{"class":637},[147,1875,173],{"class":153},[147,1877,176],{"class":153},[147,1879,630],{"class":153},[147,1881,1882,1884,1886,1888,1890,1892,1894,1896],{"class":149,"line":191},[147,1883,1508],{"class":153},[147,1885,1667],{"class":613},[147,1887,173],{"class":153},[147,1889,176],{"class":153},[147,1891,179],{"class":153},[147,1893,1676],{"class":182},[147,1895,173],{"class":153},[147,1897,188],{"class":153},[147,1899,1900,1902,1904,1906,1908,1910,1912,1914],{"class":149,"line":212},[147,1901,1508],{"class":153},[147,1903,1687],{"class":613},[147,1905,173],{"class":153},[147,1907,176],{"class":153},[147,1909,179],{"class":153},[147,1911,1696],{"class":182},[147,1913,173],{"class":153},[147,1915,188],{"class":153},[147,1917,1918,1920,1922,1924,1926],{"class":149,"line":233},[147,1919,1508],{"class":153},[147,1921,1707],{"class":613},[147,1923,173],{"class":153},[147,1925,176],{"class":153},[147,1927,630],{"class":153},[147,1929,1930,1932,1934,1936,1938,1940,1942],{"class":149,"line":254},[147,1931,1718],{"class":153},[147,1933,1722],{"class":1721},[147,1935,173],{"class":153},[147,1937,176],{"class":153},[147,1939,179],{"class":153},[147,1941,1731],{"class":182},[147,1943,271],{"class":153},[147,1945,1946],{"class":149,"line":274},[147,1947,1738],{"class":153},[147,1949,1950],{"class":149,"line":280},[147,1951,1546],{"class":153},[147,1953,1954],{"class":149,"line":695},[147,1955,277],{"class":153},[147,1957,1958],{"class":149,"line":712},[147,1959,414],{"class":153},[1004,1961,1962,1972],{},[1007,1963,1964],{},[1010,1965,1966,1969],{},[1013,1967,1968],{},"IDE",[1013,1970,1971],{},"Config file",[1020,1973,1974,1988,1997],{},[1010,1975,1976,1978],{},[1025,1977,1629],{},[1025,1979,1980,1983,1984,1987],{},[45,1981,1982],{},"~/.claude/settings.json"," (global) or ",[45,1985,1986],{},".claude/settings.json"," (per-project)",[1010,1989,1990,1992],{},[1025,1991,1754],{},[1025,1993,1994],{},[45,1995,1996],{},".cursor/mcp.json",[1010,1998,1999,2001],{},[1025,2000,1849],{},[1025,2002,2003],{},[45,2004,2005],{},"claude_desktop_config.json",[13,2007,2009],{"id":2008},"usage-and-limits","Usage and limits",[18,2011,2012,2013,2015,2016,334,2018,2020,2021,2024,2025,2028,2029,2032],{},"Every ",[45,2014,51],{}," call is logged to ",[45,2017,333],{},[45,2019,337],{}," and counts toward the same ",[22,2022,2023],{},"weekly token budget"," as the web chat and CLI (",[45,2026,2027],{},"WEEKLY_TOKEN_LIMIT",", default ",[45,2030,2031],{},"500_000"," per user per organization, resets every Monday at 00:00 UTC).",[18,2034,2035,106,2037,504,2039,2041,2042,2045,2046,2048],{},[45,2036,111],{},[45,2038,47],{},[45,2040,114],{}," do ",[22,2043,2044],{},"not"," consume the token budget; only ",[45,2047,51],{}," invokes the LLM.",[61,2050,2052],{"id":2051},"rate-limiting","Rate limiting",[18,2054,2055,2056,2058,2059,2028,2062,2065,2066,2068,2069,2071,2072,334,2075,106,2078,106,2081,504,2084,2087],{},"Each API key has a per-minute cap on ",[45,2057,1049],{}," requests (",[45,2060,2061],{},"MCP_RATE_LIMIT_PER_MINUTE",[45,2063,2064],{},"60","). ",[45,2067,1029],{}," and ",[45,2070,1039],{}," are exempt. When the limit is exceeded, the server returns HTTP ",[45,2073,2074],{},"429",[45,2076,2077],{},"Retry-After",[45,2079,2080],{},"X-RateLimit-Limit",[45,2082,2083],{},"X-RateLimit-Remaining",[45,2085,2086],{},"X-RateLimit-Reset"," headers so clients can back off cleanly.",[1613,2089,2091],{"icon":2090},"i-heroicons-light-bulb",[18,2092,2093,2094,2096,2097,2099],{},"Have your agent call ",[45,2095,47],{}," once per session to discover slugs, then pass one or more slugs to ",[45,2098,51],{}," to query across repositories simultaneously. Cross-repo questions (\"how does the API authenticate against the worker?\") work best when both projects are in the slug list.",[2101,2102,2103],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":143,"searchDepth":157,"depth":157,"links":2105},[2106,2107,2108,2113,2119,2125,2126,2127],{"id":15,"depth":157,"text":16},{"id":36,"depth":157,"text":37},{"id":55,"depth":157,"text":56,"children":2109},[2110,2111,2112],{"id":63,"depth":163,"text":64},{"id":88,"depth":163,"text":89},{"id":99,"depth":163,"text":100},{"id":117,"depth":157,"text":118,"children":2114},[2115,2116,2117,2118],{"id":47,"depth":163,"text":47},{"id":51,"depth":163,"text":51},{"id":111,"depth":163,"text":111},{"id":114,"depth":163,"text":114},{"id":975,"depth":157,"text":976,"children":2120},[2121,2123],{"id":1069,"depth":163,"text":2122},"Example: initialize",{"id":1398,"depth":163,"text":2124},"Example: tools/call",{"id":1557,"depth":157,"text":1558},{"id":1621,"depth":157,"text":1622},{"id":2008,"depth":157,"text":2009,"children":2128},[2129],{"id":2051,"depth":163,"text":2052},"Connect any AI agent to your project's living memory via MCP","md",null,{},true,"/docs/guides/mcp",{"title":5,"description":2130},"docs/3.guides/2.mcp","BeHqd4giJXEmu9ShXuBU8rROK037853OJ2oxR4Rl13g",[2140,2132],{"title":2141,"path":2142,"stem":2143,"children":-1},"Agent Chat","/docs/guides/agent-chat","docs/3.guides/2.agent-chat",[2145],{"title":2146,"path":2147,"stem":2148,"children":2149,"page":2159},"Docs","/docs","docs",[2150,2168,2177],{"title":2151,"path":2152,"stem":2153,"children":2154,"page":2159},"Getting Started","/docs/getting-started","docs/1.getting-started",[2155,2160,2164],{"title":2156,"path":2157,"stem":2158,"wip":2159},"Introduction","/docs/getting-started/introduction","docs/1.getting-started/1.introduction",false,{"title":2161,"path":2162,"stem":2163,"wip":2134},"Installation","/docs/getting-started/installation","docs/1.getting-started/2.installation",{"title":2165,"path":2166,"stem":2167,"wip":2159},"Quick Start","/docs/getting-started/quickstart","docs/1.getting-started/3.quickstart",{"title":2169,"path":2170,"stem":2171,"children":2172,"page":2159},"Concepts","/docs/concepts","docs/2.concepts",[2173],{"title":2174,"path":2175,"stem":2176,"wip":2159},"Core Concepts","/docs/concepts/overview","docs/2.concepts/1.overview",{"title":2178,"path":2179,"stem":2180,"children":2181,"page":2159},"Guides","/docs/guides","docs/3.guides",[2182,2186,2187],{"title":2183,"path":2184,"stem":2185,"wip":2134},"GitHub Integration","/docs/guides/github-integration","docs/3.guides/1.github-integration",{"title":2141,"path":2142,"stem":2143,"wip":2134},{"title":5,"path":2135,"stem":2137,"wip":2134},1779438657538]