[docs]classMCPServerInstaller:"""Handles installation of MCP servers via different methods"""
[docs]@staticmethodasyncdefcheck_tools()->Dict[str,bool]:"""Check if installation tools are available"""tools={}fortoolin['uvx','npx','npm','pip']:try:result=subprocess.run([tool,'--version'],capture_output=True,text=True,timeout=5)tools[tool]=result.returncode==0except(FileNotFoundError,subprocess.TimeoutExpired):tools[tool]=Falsereturntools
[docs]@staticmethodasyncdefinstall_with_uvx(package:str,args:list=None)->bool:"""Install package with uvx"""ifargsisNone:args=[]try:# For uvx, we don't need to install, just check if it can runcmd=['uvx','--help']result=subprocess.run(cmd,capture_output=True,text=True,timeout=10)returnresult.returncode==0exceptExceptionase:print(f"Error with uvx: {e}")returnFalse
[docs]@staticmethodasyncdefinstall_with_npx(package:str,args:list=None)->bool:"""Install package with npx (similar to uvx, runs without global install)"""ifargsisNone:args=[]try:# For npx, we don't need to install, just check if it can runcmd=['npx','--help']result=subprocess.run(cmd,capture_output=True,text=True,timeout=10)returnresult.returncode==0exceptExceptionase:print(f"Error with npx: {e}")returnFalse
[docs]@staticmethodasyncdefinstall_with_pip(package:str,args:list=None)->bool:"""Install package with pip"""ifargsisNone:args=[]try:cmd=['pip','install']+args+[package]result=subprocess.run(cmd,capture_output=True,text=True,timeout=60)returnresult.returncode==0exceptExceptionase:print(f"Error installing with pip: {e}")returnFalse
[docs]@staticmethodasyncdefinstall_with_npm(package:str,args:list=None)->bool:"""Install package with npm"""ifargsisNone:args=[]try:cmd=['npm','install','-g']+args+[package]result=subprocess.run(cmd,capture_output=True,text=True,timeout=120)returnresult.returncode==0exceptExceptionase:print(f"Error installing with npm: {e}")returnFalse