octocode-mcp
Version:
Model Context Protocol (MCP) server for advanced GitHub repository analysis and code discovery. Provides AI assistants with powerful tools to search, analyze, and understand codebases across GitHub.
17 lines (16 loc) • 14.3 kB
JavaScript
import { createRequire as __createRequire } from 'module';
import { fileURLToPath as __fileURLToPath } from 'url';
import { dirname as __dirname_fn } from 'path';
const require = __createRequire(import.meta.url);
const __filename = __fileURLToPath(import.meta.url);
const __dirname = __dirname_fn(__filename);
var we=Object.defineProperty;var c=(e,t,o)=>()=>{if(o)throw o[0];try{return e&&(t=e(e=0)),t}catch(r){throw o=[r],r}};var x=(e,t)=>{for(var o in t)we(e,o,{get:t[o],enumerable:!0})};function H(e){try{let t=e();return{toolsToRun:t.toolsToRun??[],enableTools:t.enableTools??[],disableTools:t.disableTools??[]}}catch{return{toolsToRun:[],enableTools:[],disableTools:[]}}}function G(e){return e.toolsToRun.length>0&&(e.enableTools.length>0||e.disableTools.length>0)}function N(e,t){let{localEnabled:o,cloneEnabled:r,filterConfig:i}=t;if(e.isLocal&&!o||e.isClone&&!r)return!1;let{toolsToRun:n,enableTools:l,disableTools:u}=i;return n.length>0?n.includes(e.name):u.includes(e.name)?!1:l.includes(e.name)||e.isDefault}var I,v=c(()=>{"use strict";I=`Warning: TOOLS_TO_RUN cannot be used together with ENABLE_TOOLS/DISABLE_TOOLS. Using TOOLS_TO_RUN exclusively.
`});function k(e,t){if(e.skipMetadataCheck)return!0;try{return!!t.hasTool(e.name)}catch{return!1}}var A=c(()=>{"use strict"});import{McpError as Ie,ErrorCode as He}from"@modelcontextprotocol/sdk/types.js";import{ContentSanitizer as Ge,maskSensitiveData as Ne,sanitizeCallToolResult as ve,buildToolErrorResult as ke}from"@octocodeai/octocode-tools-core";function M(e){if(e instanceof Error){let t=e.code;return{name:e.name||"Error",message:e.message||String(e),code:typeof t=="string"?t:void 0}}if(typeof e=="string")return{name:"Error",message:e};if(e&&typeof e=="object"){let t=e,o=typeof t.message=="string"?t.message:Me(t)??"Unknown error",r=typeof t.name=="string"?t.name:"Error",i=typeof t.code=="string"?t.code:void 0;return{name:r,message:o,code:i}}return{name:"Error",message:e===void 0?"undefined":String(e)}}function Ae(e,t){let o=F(M(t).message),r={type:"text",text:`\u26A0\uFE0F Output sanitization failed \u2014 the content below was NOT scrubbed for secrets and may contain sensitive data. Reason: ${o}`},i=Array.isArray(e.content)?e.content:[];try{process.stderr.write(`[octocode-mcp] output sanitization failed; returning unsanitized result with warning: ${o}
`)}catch{}return{...e,content:[r,...i]}}function Me(e){try{return JSON.stringify(e)}catch{return}}function F(e){try{let t=Ge.sanitizeContent(e);return Ne(t.hasSecrets?t.content:e)}catch{return e}}function Fe(e,t){return async(...o)=>{try{let r=await t(...o);try{return ve(r)}catch(i){return Ae(r,i)}}catch(r){return ke(e,r)}}}function Pe(e,t,o){return async(...r)=>{try{return await Promise.resolve(o(...r))}catch(i){let n=M(i),l=F(n.message);throw new Ie(He.InternalError,`${e} "${t}" failed: ${l}`)}}}function P(e){return new Proxy(e,{get(t,o,r){return o==="registerTool"?(i,n,l)=>{let u=Fe(i,l);return t.registerTool(i,n,u)}:o==="registerResource"?(i,n,l,u)=>{let g=Pe("resource",i,u);return t.registerResource(i,n,l,g)}:Reflect.get(t,o,r)}})}var D=c(()=>{"use strict"});async function De(e,t,o,r){if(!r(e))return{status:"skipped"};try{return await e.fn(t,o)!==null?{status:"success"}:{status:"skipped"}}catch(i){return{status:"failed",toolName:e.name,error:i instanceof Error?i.message:String(i)}}}async function U(e,t,o,r){return Promise.all(e.map(i=>De(i,t,o,r)))}function B(e){let t=e.filter(n=>n.status==="success").length,o=e.filter(n=>n.status==="failed"),r=o.map(n=>n.toolName),i=Object.fromEntries(o.map(n=>[n.toolName,n.error]));return r.length>0?{successCount:t,failedTools:r,failedToolErrors:i}:{successCount:t,failedTools:r}}var j=c(()=>{"use strict"});function C(e){let t=e;for(;t?._zod?.def?.type==="pipe";)t=t._zod.def.out;return(t?._def?.typeName==="ZodEffects"||t?._def?.typeName==="ZodPipeline")&&(t=t._def.schema??t._def.in??e),t??e}var _=c(()=>{"use strict"});import{withSecurityValidation as Ue}from"@octocodeai/octocode-tools-core";import{DESCRIPTIONS as Be,invokeCallbackSafely as je}from"@octocodeai/octocode-tools-core";function a(e){let{name:t,title:o,inputSchema:r,executionFn:i,describe:n,annotations:l,registrationGuard:u}=e;return(g,E)=>{let S=()=>{let T=Be[t]??"",Le=n?n(T):T;return g.registerTool(t,{description:Le,inputSchema:C(r),annotations:{title:o,readOnlyHint:l?.readOnlyHint??!0,destructiveHint:l?.destructiveHint??!1,idempotentHint:l?.idempotentHint??!0,openWorldHint:l?.openWorldHint??!0}},Ue(t,async(h,y)=>{let O=h.queries||[];return await je(E,t,O),i({queries:O,responseCharOffset:h.responseCharOffset,responseCharLength:h.responseCharLength,authInfo:y.authInfo,sessionId:y.sessionId,signal:y.signal})}))};return u?u().then(T=>T?S():null):S()}}var d=c(()=>{"use strict";_()});import{TOOL_NAMES as ze,GitHubCodeSearchBulkQueryLocalSchema as Qe,searchMultipleGitHubCode as We}from"@octocodeai/octocode-tools-core";var z,Q=c(()=>{"use strict";d();z=a({name:ze.GITHUB_SEARCH_CODE,title:"GitHub Code Search",inputSchema:Qe,executionFn:We})});import{TOOL_NAMES as Ve,FileContentBulkQueryLocalSchema as $e,fetchMultipleGitHubFileContents as qe}from"@octocodeai/octocode-tools-core";var W,V=c(()=>{"use strict";d();W=a({name:Ve.GITHUB_FETCH_CONTENT,title:"GitHub File Content Fetch",inputSchema:$e,executionFn:qe})});import{TOOL_NAMES as Ke,GitHubViewRepoStructureBulkQueryLocalSchema as Je,exploreMultipleRepositoryStructures as Ye}from"@octocodeai/octocode-tools-core";var $,q=c(()=>{"use strict";d();$=a({name:Ke.GITHUB_VIEW_REPO_STRUCTURE,title:"GitHub Repository Structure Explorer",inputSchema:Je,executionFn:Ye})});import{TOOL_NAMES as Ze,GitHubReposSearchBulkQueryLocalSchema as Xe,searchMultipleGitHubRepos as et}from"@octocodeai/octocode-tools-core";var K,J=c(()=>{"use strict";d();K=a({name:Ze.GITHUB_SEARCH_REPOSITORIES,title:"GitHub Repository Search",inputSchema:Xe,executionFn:et})});import{TOOL_NAMES as b,SearchPullRequestsBulkLocalSchema as tt,SearchIssuesBulkLocalSchema as ot,SearchCommitsBulkLocalSchema as rt,ListReleasesBulkLocalSchema as it,searchMultipleGitHubPullRequestsSplit as nt,searchMultipleGitHubIssues as st,searchMultipleGitHubCommits as ct,listMultipleGitHubReleases as at}from"@octocodeai/octocode-tools-core";var Y,Z,X,ee,te=c(()=>{"use strict";d();Y=a({name:b.GITHUB_PULL_REQUESTS,title:"GitHub Pull Request Search",inputSchema:tt,executionFn:nt}),Z=a({name:b.GITHUB_ISSUES,title:"GitHub Issue Search",inputSchema:ot,executionFn:st}),X=a({name:b.GITHUB_COMMITS,title:"GitHub Commit History",inputSchema:rt,executionFn:ct}),ee=a({name:b.GITHUB_RELEASES,title:"GitHub Releases",inputSchema:it,executionFn:at})});import{TOOL_NAMES as lt,SearchDiscussionsBulkLocalSchema as ut,searchMultipleGitHubDiscussions as mt}from"@octocodeai/octocode-tools-core";var oe,re=c(()=>{"use strict";d();oe=a({name:lt.GITHUB_DISCUSSIONS,title:"GitHub Discussions Search",inputSchema:ut,executionFn:mt})});import{TOOL_NAMES as pt,NpmSearchBulkQueryLocalSchema as dt,searchPackages as Tt}from"@octocodeai/octocode-tools-core";var ie,ne=c(()=>{"use strict";d();ie=a({name:pt.PACKAGE_SEARCH,title:"Package Search",inputSchema:dt,executionFn:Tt,annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}})});import{TOOL_NAMES as ft,BulkCloneRepoLocalSchema as gt,executeCloneRepo as St}from"@octocodeai/octocode-tools-core";var se,ce=c(()=>{"use strict";d();se=a({name:ft.GITHUB_CLONE_REPO,title:"Clone / Fetch GitHub Repository Locally",inputSchema:gt,executionFn:St,annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0}})});import{DESCRIPTIONS as Ct,withBasicSecurityValidation as bt}from"@octocodeai/octocode-tools-core";function m({name:e,title:t,inputSchema:o,executionFn:r,annotations:i}){return n=>n.registerTool(e,{description:Ct[e],inputSchema:C(o),annotations:{title:t,readOnlyHint:i?.readOnlyHint??!0,destructiveHint:i?.destructiveHint??!1,idempotentHint:i?.idempotentHint??!0,openWorldHint:i?.openWorldHint??!1}},bt(r,e))}var f=c(()=>{"use strict";_()});import{TOOL_NAMES as Et,LocalRipgrepBulkQuerySchema as ht,executeRipgrepSearch as yt}from"@octocodeai/octocode-tools-core";var ae,le=c(()=>{"use strict";f();ae=m({name:Et.LOCAL_RIPGREP,title:"Local Ripgrep Search",inputSchema:ht,executionFn:yt})});import{TOOL_NAMES as Rt,LocalViewStructureBulkQuerySchema as _t,executeViewStructure as Ot}from"@octocodeai/octocode-tools-core";var ue,me=c(()=>{"use strict";f();ue=m({name:Rt.LOCAL_VIEW_STRUCTURE,title:"Local View Structure",inputSchema:_t,executionFn:Ot})});import{TOOL_NAMES as xt,LocalFindFilesBulkQuerySchema as Lt,executeFindFiles as wt}from"@octocodeai/octocode-tools-core";var pe,de=c(()=>{"use strict";f();pe=m({name:xt.LOCAL_FIND_FILES,title:"Local Find Files",inputSchema:Lt,executionFn:wt})});import{TOOL_NAMES as It,LocalFindDeadCodeBulkQuerySchema as Ht,executeFindDeadCode as Gt}from"@octocodeai/octocode-tools-core";var Te,fe=c(()=>{"use strict";f();Te=m({name:It.LOCAL_FIND_DEAD_CODE,title:"Local Find Dead Code",inputSchema:Ht,executionFn:Gt})});import{TOOL_NAMES as Nt,LocalFetchContentBulkQuerySchema as vt,executeFetchContent as kt}from"@octocodeai/octocode-tools-core";var ge,Se=c(()=>{"use strict";f();ge=m({name:Nt.LOCAL_FETCH_CONTENT,title:"Local Fetch Content",inputSchema:vt,executionFn:kt})});import{BulkLspGetSemanticsQuerySchema as At,executeLspGetSemantics as Mt,LSP_GET_SEMANTICS_TOOL_NAME as Ft}from"@octocodeai/octocode-tools-core";var Ce,be=c(()=>{"use strict";f();Ce=m({name:Ft,title:"Get Semantic Content",inputSchema:At,executionFn:Mt})});var ye={};x(ye,{ALL_TOOLS:()=>he,DEFAULT_TOOL_METADATA_GATEWAY:()=>Dt,GITHUB_CLONE_REPO:()=>$t,GITHUB_FETCH_CONTENT:()=>zt,GITHUB_SEARCH_CODE:()=>jt,GITHUB_SEARCH_REPOSITORIES:()=>Wt,GITHUB_VIEW_REPO_STRUCTURE:()=>Qt,LOCAL_FETCH_CONTENT:()=>Zt,LOCAL_FIND_DEAD_CODE:()=>Yt,LOCAL_FIND_FILES:()=>Jt,LOCAL_RIPGREP:()=>qt,LOCAL_VIEW_STRUCTURE:()=>Kt,LSP_GET_SEMANTIC_CONTENT:()=>Xt,PACKAGE_SEARCH:()=>Vt,getDescription:()=>Ut});import{ALL_TOOLS as Pt,STATIC_TOOL_NAMES as s,LSP_GET_SEMANTICS_TOOL_NAME as Ee,DEFAULT_TOOL_METADATA_GATEWAY as Dt,getDescription as Ut}from"@octocodeai/octocode-tools-core";function p(e){let t=he.find(o=>o.name===e);if(!t)throw new Error(`Tool not found in MCP registry: "${e}"`);return t}var Bt,he,jt,zt,Qt,Wt,Vt,$t,qt,Kt,Jt,Yt,Zt,Xt,Re=c(()=>{"use strict";Q();V();q();J();te();re();ne();ce();le();me();de();fe();Se();be();Bt={[s.GITHUB_SEARCH_CODE]:z,[s.GITHUB_FETCH_CONTENT]:W,[s.GITHUB_VIEW_REPO_STRUCTURE]:$,[s.GITHUB_SEARCH_REPOSITORIES]:K,[s.GITHUB_PULL_REQUESTS]:Y,[s.GITHUB_ISSUES]:Z,[s.GITHUB_COMMITS]:X,[s.GITHUB_RELEASES]:ee,[s.GITHUB_DISCUSSIONS]:oe,[s.PACKAGE_SEARCH]:ie,[s.GITHUB_CLONE_REPO]:se,[s.LOCAL_RIPGREP]:ae,[s.LOCAL_VIEW_STRUCTURE]:ue,[s.LOCAL_FIND_FILES]:pe,[s.LOCAL_FIND_DEAD_CODE]:Te,[s.LOCAL_FETCH_CONTENT]:ge,[Ee]:Ce},he=Pt.map(e=>{let t=Bt[e.name];if(!t)throw new Error(`No MCP fn registered for tool: ${e.name}`);return{...e,fn:t}});jt=p(s.GITHUB_SEARCH_CODE),zt=p(s.GITHUB_FETCH_CONTENT),Qt=p(s.GITHUB_VIEW_REPO_STRUCTURE),Wt=p(s.GITHUB_SEARCH_REPOSITORIES),Vt=p(s.PACKAGE_SEARCH),$t=p(s.GITHUB_CLONE_REPO),qt=p(s.LOCAL_RIPGREP),Kt=p(s.LOCAL_VIEW_STRUCTURE),Jt=p(s.LOCAL_FIND_FILES),Yt=p(s.LOCAL_FIND_DEAD_CODE),Zt=p(s.LOCAL_FETCH_CONTENT),Xt=p(Ee)});var _e={};x(_e,{registerTools:()=>io});import{getServerConfig as eo,isLocalEnabled as to,isCloneEnabled as oo,DEFAULT_TOOL_METADATA_GATEWAY as ro}from"@octocodeai/octocode-tools-core";async function io(e,t,o={}){let r=to(),i=oo(),n=H(eo),l=o.metadataGateway??ro;G(n)&&process.stderr.write(I);let u=P(e),E=(await no(o.toolLoader)).filter(T=>N(T,{localEnabled:r,cloneEnabled:i,filterConfig:n})),S=await U(E,u,t,T=>k(T,{hasTool:l.hasTool}));return B(S)}async function no(e){if(e)return Promise.resolve(e());let{ALL_TOOLS:t}=await Promise.resolve().then(()=>(Re(),ye));return t}var Oe=c(()=>{"use strict";v();A();D();j()});import{McpServer as so}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as co}from"@modelcontextprotocol/sdk/server/stdio.js";import{clearAllCache as ao,clearOctokitInstances as lo,initialize as uo,cleanup as mo,getGitHubToken as po,isCloneEnabled as To,getActiveProvider as fo,initializeProviders as go,clearProviderCache as So,loadToolContent as Co,STARTUP_ERRORS as bo,startCacheGC as Eo,stopCacheGC as ho,completeMetadata as yo,getOctocodeDir as xe,configureSecurity as Ro,securityRegistry as _o}from"@octocodeai/octocode-tools-core";var w="@octocodeai/mcp";var R="18.0.1";var Oo={name:`${w}_${R}`,title:"Octocode MCP",version:R},xo=5e3;function Lo(e,t){return async o=>{if(!t.inProgress){t.inProgress=!0;try{t.timeout&&(clearTimeout(t.timeout),t.timeout=null),t.timeout=setTimeout(()=>process.exit(1),xo),ho(),ao(),lo(),So(),mo();try{await e.close()}catch{}t.timeout&&(clearTimeout(t.timeout),t.timeout=null),process.exit(0)}catch(r){t.timeout&&(clearTimeout(t.timeout),t.timeout=null);let i=r instanceof Error?r.message:String(r??"unknown");process.stderr.write(`Shutdown error: ${i}
`),process.exit(1)}}}}function wo(e){process.once("SIGINT",()=>e("SIGINT")),process.once("SIGTERM",()=>e("SIGTERM")),process.stdin.once("close",()=>e("STDIN_CLOSE")),process.once("uncaughtException",t=>{e("UNCAUGHT_EXCEPTION")}),process.once("unhandledRejection",t=>{e("UNHANDLED_REJECTION")})}async function Io(e){fo()==="github"&&await po();let{registerTools:o}=await Promise.resolve().then(()=>(Oe(),_e)),{successCount:r,failedTools:i,failedToolErrors:n}=await o(e);if(i.length>0){let l=Object.entries(n??{}).map(([u,g])=>` - ${u}: ${g}`).join(`
`);process.stderr.write(`Warning: ${i.length} tool(s) failed to register:
${l}
`)}if(r===0)throw new Error(bo.NO_TOOLS_REGISTERED.message)}async function Ho(){let e={tools:{listChanged:!1}};return new so(Oo,{capabilities:e,instructions:yo.systemPrompt})}async function Go(){let e={inProgress:!1,timeout:null};try{await uo(),Ro({}),_o.addAllowedRoots([xe()]),await go(),await Co();let t=await Ho();await Io(t);let o=Lo(t,e);wo(o);let r=new co;await t.connect(r),To()&&Eo(xe())}catch(t){let o=t instanceof Error?t.message:String(t??"unknown");process.stderr.write(`Server initialization failed: ${o}
`),process.exit(1)}}Go().catch(e=>{let t=e instanceof Error?e.message:String(e||"Unknown error");process.stderr.write(`\u274C Startup failed: ${t}
`),process.exit(1)});export{Io as registerAllTools};