85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
import json
|
|
import subprocess
|
|
import asyncio
|
|
import aiohttp
|
|
from loguru import logger
|
|
|
|
async def start_mcps_simple(config):
|
|
"""Simple function to start MCPs from config dictionary"""
|
|
processes = []
|
|
|
|
for name, mcp_config in config.items():
|
|
transport = mcp_config.get("transport", "").lower()
|
|
|
|
if transport == "stdio":
|
|
# Start stdio-based MCP
|
|
try:
|
|
command = mcp_config.get("command")
|
|
args = mcp_config.get("args", [])
|
|
cmd = [command] + args
|
|
|
|
logger.info(f"Starting {name} with command: {' '.join(cmd)}")
|
|
process = subprocess.Popen(
|
|
cmd,
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
text=True
|
|
)
|
|
processes.append((name, process))
|
|
logger.info(f"Started {name} (PID: {process.pid})")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to start {name}: {e}")
|
|
|
|
elif transport == "streamable_http":
|
|
# Check HTTP-based MCP
|
|
try:
|
|
url = mcp_config.get("url")
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.get(url, timeout=5) as response:
|
|
if response.status == 200:
|
|
logger.info(f"HTTP MCP {name} is accessible at {url}")
|
|
else:
|
|
logger.warning(f"HTTP MCP {name} returned status {response.status}")
|
|
except Exception as e:
|
|
logger.error(f"Failed to connect to {name}: {e}")
|
|
|
|
return processes
|
|
|
|
# Usage example
|
|
async def main_simple(config=None):
|
|
if config is None:
|
|
config = {
|
|
"calculator": {
|
|
"transport": "stdio",
|
|
"command": "python",
|
|
"args": ["lang_agent/calculator.py"],
|
|
}
|
|
}
|
|
|
|
processes = await start_mcps_simple(config)
|
|
|
|
print(f"Started {len(processes)} processes")
|
|
|
|
# Keep running
|
|
try:
|
|
while True:
|
|
await asyncio.sleep(1)
|
|
except KeyboardInterrupt:
|
|
print("Stopping processes...")
|
|
for name, process in processes:
|
|
process.terminate()
|
|
logger.info(f"Stopped {name}")
|
|
|
|
|
|
def run_all_mcps(mcp_config_f="configs/mcp_config.json"):
|
|
with open(mcp_config_f, "r") as f:
|
|
config = json.load(f)
|
|
|
|
asyncio.run(main_simple(config))
|
|
|
|
if __name__ == "__main__":
|
|
run_all_mcps()
|
|
# asyncio.run(main_simple())
|