Files
lang-agent/scripts/ws_start_all_mcps.py
2025-10-13 15:43:06 +08:00

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())