[{"data":1,"prerenderedAt":627},["ShallowReactive",2],{"navigation_docs":3,"-guide-agents":80,"-guide-agents-surround":622},[4,56],{"title":5,"path":6,"stem":7,"children":8,"icon":55},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43,47,51],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Authentication","\u002Fguide\u002Fauth","1.guide\u002F02.auth",{"title":16,"path":17,"stem":18},"Repositories","\u002Fguide\u002Frepositories","1.guide\u002F03.repositories",{"title":20,"path":21,"stem":22},"Issues","\u002Fguide\u002Fissues","1.guide\u002F04.issues",{"title":24,"path":25,"stem":26},"Pull requests","\u002Fguide\u002Fpull-requests","1.guide\u002F05.pull-requests",{"title":28,"path":29,"stem":30},"Review threads","\u002Fguide\u002Fthreads","1.guide\u002F06.threads",{"title":32,"path":33,"stem":34},"Commits and CI","\u002Fguide\u002Fcommits","1.guide\u002F07.commits",{"title":36,"path":37,"stem":38},"Contribution templates","\u002Fguide\u002Ftemplates","1.guide\u002F08.templates",{"title":40,"path":41,"stem":42},"Code search","\u002Fguide\u002Fcode-search","1.guide\u002F09.code-search",{"title":44,"path":45,"stem":46},"Agents","\u002Fguide\u002Fagents","1.guide\u002F10.agents",{"title":48,"path":49,"stem":50},"Custom providers","\u002Fguide\u002Fcustom","1.guide\u002F11.custom",{"title":52,"path":53,"stem":54},"Explorer","\u002Fguide\u002Fexplorer","1.guide\u002F12.explorer","i-lucide-book-open",{"title":57,"path":58,"stem":59,"children":60,"icon":79},"Platforms","\u002Fplatforms","2.platforms\u002F0.index",[61,63,67,71,75],{"title":62,"path":58,"stem":59},"Overview",{"title":64,"path":65,"stem":66},"GitHub","\u002Fplatforms\u002Fgithub","2.platforms\u002F01.github",{"title":68,"path":69,"stem":70},"GitLab","\u002Fplatforms\u002Fgitlab","2.platforms\u002F02.gitlab",{"title":72,"path":73,"stem":74},"Gitea","\u002Fplatforms\u002Fgitea","2.platforms\u002F03.gitea",{"title":76,"path":77,"stem":78},"GitBucket","\u002Fplatforms\u002Fgitbucket","2.platforms\u002F04.gitbucket","i-lucide-library",{"id":81,"title":44,"body":82,"description":614,"extension":615,"links":616,"meta":617,"navigation":619,"path":45,"seo":620,"stem":46,"__hash__":621},"docs\u002F1.guide\u002F10.agents.md",{"type":83,"value":84,"toc":606},"minimark",[85,90,99,265,283,287,345,348,461,472,489,493,501,523,529,533,546,549,553,569,583,587,594,602],[86,87,89],"h2",{"id":88},"thirty-tools-three-surfaces","Thirty tools, three surfaces",[91,92,93,94,98],"p",{},"The MCP server, the Pi extension and the OMP extension all call the same executors in ",[95,96,97],"code",{},"src\u002Ftool-operations.ts",", so they answer identically. Fix one, fixed everywhere. The tools mirror the nine resources:",[100,101,102,115],"table",{},[103,104,105],"thead",{},[106,107,108,112],"tr",{},[109,110,111],"th",{},"Group",[109,113,114],{},"Tools",[116,117,118,133,146,155,171,196,227,243],"tbody",{},[106,119,120,124],{},[121,122,123],"td",{},"repositories",[121,125,126,129,130],{},[95,127,128],{},"forges_repos_list",", ",[95,131,132],{},"forges_repos_get",[106,134,135,138],{},[121,136,137],{},"contribution templates",[121,139,140,129,143],{},[95,141,142],{},"forges_contribution_templates_list",[95,144,145],{},"forges_contribution_templates_get",[106,147,148,150],{},[121,149,95],{},[121,151,152],{},[95,153,154],{},"forges_code_search",[106,156,157,160],{},[121,158,159],{},"CI and commits",[121,161,162,129,165,129,168],{},[95,163,164],{},"forges_ci_runs_list",[95,166,167],{},"forges_commits_list",[95,169,170],{},"forges_commits_get",[106,172,173,176],{},[121,174,175],{},"issues",[121,177,178,129,181,129,184,129,187,129,190,129,193],{},[95,179,180],{},"forges_issues_list",[95,182,183],{},"forges_issues_search",[95,185,186],{},"forges_issues_get",[95,188,189],{},"forges_issues_comments",[95,191,192],{},"forges_issues_comments_get",[95,194,195],{},"forges_issues_create",[106,197,198,201],{},[121,199,200],{},"pull requests",[121,202,203,129,206,129,209,129,212,129,215,129,218,129,221,129,224],{},[95,204,205],{},"forges_pull_requests_list",[95,207,208],{},"forges_pull_requests_search",[95,210,211],{},"forges_pull_requests_get",[95,213,214],{},"forges_pull_requests_files",[95,216,217],{},"forges_pull_requests_checks",[95,219,220],{},"forges_pull_requests_comments",[95,222,223],{},"forges_pull_requests_comments_get",[95,225,226],{},"forges_pull_requests_create",[106,228,229,232],{},[121,230,231],{},"users and auth",[121,233,234,129,237,129,240],{},[95,235,236],{},"forges_users_get",[95,238,239],{},"forges_users_authenticated",[95,241,242],{},"forges_auth_reload",[106,244,245,248],{},[121,246,247],{},"review threads",[121,249,250,129,253,129,256,129,259,129,262],{},[95,251,252],{},"forges_threads_list",[95,254,255],{},"forges_threads_get",[95,257,258],{},"forges_threads_reply",[95,260,261],{},"forges_threads_resolve",[95,263,264],{},"forges_threads_unresolve",[91,266,267,268,271,272,129,275,278,279,282],{},"Every tool takes a ",[95,269,270],{},"platform"," of ",[95,273,274],{},"github",[95,276,277],{},"gitlab"," or ",[95,280,281],{},"gitea"," plus the owner, repo, number or username the call needs.",[86,284,286],{"id":285},"mcp","MCP",[288,289,294],"pre",{"className":290,"code":291,"language":292,"meta":293,"style":293},"language-bash shiki shiki-themes github-light github-light poimandres","forges mcp\nclaude mcp add forges --scope user -- npx -y @agntn\u002Fforges mcp\n","bash","",[95,295,296,309],{"__ignoreMap":293},[297,298,301,305],"span",{"class":299,"line":300},"line",1,[297,302,304],{"class":303},"sseY5","forges",[297,306,308],{"class":307},"sX7Zv"," mcp\n",[297,310,312,315,318,321,324,328,331,334,337,340,343],{"class":299,"line":311},2,[297,313,314],{"class":303},"claude",[297,316,317],{"class":307}," mcp",[297,319,320],{"class":307}," add",[297,322,323],{"class":307}," forges",[297,325,327],{"class":326},"sqT1Y"," --scope",[297,329,330],{"class":307}," user",[297,332,333],{"class":326}," --",[297,335,336],{"class":307}," npx",[297,338,339],{"class":326}," -y",[297,341,342],{"class":307}," @agntn\u002Fforges",[297,344,308],{"class":307},[91,346,347],{},"Or in a client's config:",[288,349,353],{"className":350,"code":351,"language":352,"meta":293,"style":293},"language-json shiki shiki-themes github-light github-light poimandres","{\n  \"mcpServers\": {\n    \"forges\": { \"command\": \"npx\", \"args\": [\"-y\", \"@agntn\u002Fforges\", \"mcp\"] }\n  }\n}\n","json",[95,354,355,361,377,449,455],{"__ignoreMap":293},[297,356,357],{"class":299,"line":300},[297,358,360],{"class":359},"sKlNE","{\n",[297,362,363,367,371,374],{"class":299,"line":311},[297,364,366],{"class":365},"sy8Ar","  \"",[297,368,370],{"class":369},"saoiD","mcpServers",[297,372,373],{"class":365},"\"",[297,375,376],{"class":359},": {\n",[297,378,380,383,385,387,390,392,396,398,401,404,408,410,412,414,417,419,422,424,427,429,431,433,436,438,440,442,444,446],{"class":299,"line":379},3,[297,381,382],{"class":365},"    \"",[297,384,304],{"class":326},[297,386,373],{"class":365},[297,388,389],{"class":359},": { ",[297,391,373],{"class":365},[297,393,395],{"class":394},"s39Ir","command",[297,397,373],{"class":365},[297,399,400],{"class":359},": ",[297,402,373],{"class":403},"scVjq",[297,405,407],{"class":406},"sQ7BG","npx",[297,409,373],{"class":403},[297,411,129],{"class":359},[297,413,373],{"class":365},[297,415,416],{"class":394},"args",[297,418,373],{"class":365},[297,420,421],{"class":359},": [",[297,423,373],{"class":403},[297,425,426],{"class":406},"-y",[297,428,373],{"class":403},[297,430,129],{"class":359},[297,432,373],{"class":403},[297,434,435],{"class":406},"@agntn\u002Fforges",[297,437,373],{"class":403},[297,439,129],{"class":359},[297,441,373],{"class":403},[297,443,285],{"class":406},[297,445,373],{"class":403},[297,447,448],{"class":359},"] }\n",[297,450,452],{"class":299,"line":451},4,[297,453,454],{"class":359},"  }\n",[297,456,458],{"class":299,"line":457},5,[297,459,460],{"class":359},"}\n",[91,462,463,464,467,468,471],{},"The server speaks MCP over stdio. ",[95,465,466],{},"createMcpServer()"," from ",[95,469,470],{},"@agntn\u002Fforges\u002Fmcp"," returns the same server for a host that brings its own transport.",[91,473,474,475,477,478,480,481,484,485,488],{},"An MCP client sees the text a tool returns and nothing else, so the text carries the whole answer as JSON. Lists and searches drop bodies and name the tool that reads one in full. One page of a busy repository with bodies is big enough to push the conversation that asked for it out of the window, and I would rather the model asks twice. Pull request search leaves revision details to ",[95,476,211],{},". ",[95,479,252],{}," bounds each comment to twelve lines and four thousand characters but keeps every comment of every thread on the page, so ask for a small ",[95,482,483],{},"perPage"," on a heavily reviewed pull request. The comment tools carry the same bound, and their ",[95,486,487],{},"_get"," variants read one comment whole.",[86,490,492],{"id":491},"reads-writes-and-credentials","Reads, writes and credentials",[91,494,495,496,500],{},"Read tools use the normal ",[497,498,499],"a",{"href":13},"token chain"," and fall back to anonymous access when nothing is found. Anonymous providers are kept apart and can never be reused for a write, not even by accident.",[91,502,503,504,129,506,129,508,129,510,512,513,515,516,519,520,522],{},"Five tools write: ",[95,505,195],{},[95,507,226],{},[95,509,258],{},[95,511,261],{}," and ",[95,514,264],{},". They carry MCP annotations saying so, ",[95,517,518],{},"readOnlyHint: false",". The two creates and the reply are marked as not idempotent because doing them twice leaves two of them behind. Resolve and unresolve are idempotent. ",[95,521,239],{}," names the account the writes would go out as, check it before you let a model write anything.",[91,524,525,526,528],{},"The credential stays pinned per platform and endpoint until ",[95,527,242],{}," swaps it and returns the new profile. Reload is gated as a mutation because it changes local server state. It writes nothing to the platform.",[86,530,532],{"id":531},"hosts-stay-local","Hosts stay local",[91,534,535,536,129,539,278,542,545],{},"A self hosted endpoint is ",[95,537,538],{},"FORGES_GITHUB_BASE_URL",[95,540,541],{},"FORGES_GITLAB_BASE_URL",[95,543,544],{},"FORGES_GITEA_BASE_URL"," in the agent's process environment. Never a tool argument, so a model cannot aim a call at another host. A failure names the status and, on a rate limit, the retry window. It never repeats the endpoint, so the host stays out of the model's context even when the platform answers with an error.",[91,547,548],{},"A failed operation is a tool error, not a transport failure: unknown repository, rejected token, exhausted rate limit. The model sees a sentence, the session survives.",[86,550,552],{"id":551},"pi-and-omp","Pi and OMP",[288,554,556],{"className":290,"code":555,"language":292,"meta":293,"style":293},"pi install npm:@agntn\u002Fforges\n",[95,557,558],{"__ignoreMap":293},[297,559,560,563,566],{"class":299,"line":300},[297,561,562],{"class":303},"pi",[297,564,565],{"class":307}," install",[297,567,568],{"class":307}," npm:@agntn\u002Fforges\n",[91,570,571,572,575,576,578,579,582],{},"The package declares both extensions in ",[95,573,574],{},"package.json",". They render tool calls and results in the terminal: a repository row, a list of pull requests with their states, a thread with its comments, bounded the same way the MCP text is. ",[95,577,132],{}," includes fork state, the parent and the viewer's role. A ",[95,580,581],{},"null"," role means the platform said nothing, not that the viewer has no access.",[86,584,586],{"id":585},"what-the-answer-is","What the answer is",[91,588,589,590,593],{},"The tools return the normalized objects, not prose. The ",[497,591,52],{"href":592},"\u002Fexplorer"," shows the same objects for any public repository, a quick way to check a model's summary against the source when it gets creative.",[595,596,597,598,601],"caution",{},"Issue bodies, comments and review threads are written by whoever has an account on the platform. Data to report, not instructions to follow. An agent that reads ",[95,599,600],{},"body: \"ignore previous instructions\""," has learned one thing about the issue and nothing about what to do next.",[603,604,605],"style",{},"html pre.shiki code .sseY5, html code.shiki .sseY5{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#91B4D5}html pre.shiki code .sX7Zv, html code.shiki .sX7Zv{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#ADD7FF}html pre.shiki code .sqT1Y, html code.shiki .sqT1Y{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#ADD7FF}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 .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .sy8Ar, html code.shiki .sy8Ar{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCD}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .s39Ir, html code.shiki .s39Ir{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#91B4D5}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}",{"title":293,"searchDepth":311,"depth":311,"links":607},[608,609,610,611,612,613],{"id":88,"depth":311,"text":89},{"id":285,"depth":311,"text":286},{"id":491,"depth":311,"text":492},{"id":531,"depth":311,"text":532},{"id":551,"depth":311,"text":552},{"id":585,"depth":311,"text":586},"The same thirty tools over MCP, the Pi extension and the OMP extension, what they hold back, and how tokens and hosts stay out of a model's hands.","md",null,{"icon":618},"i-lucide-bot",true,{"title":44,"description":614},"Vse-QVMPiYY1eiaRfcD6vUJ0JOk0L63mzP-t8xYvYa4",[623,625],{"title":40,"path":41,"stem":42,"description":624,"children":-1},"File matches by query, global or scoped to an owner or a repository, on the platforms that have an endpoint for it.",{"title":48,"path":49,"stem":50,"description":626,"children":-1},"Extend the abstract Provider for a platform this package does not know, implement the typed mappers, and get the nine resources for free.",1788525966686]