"""
Command-line interface for scvi-mcp.
"""
import asyncio
import argparse
import os
import sys
def parse_arguments():
"""Parse command line arguments"""
parser = argparse.ArgumentParser(description='scvi-tools MCP Server')
subparsers = parser.add_subparsers(dest='command', help='Available commands')
# Add run subcommand
run_parser = subparsers.add_parser('run', help='Start scvi-tools MCP Server')
run_parser.add_argument(
'--log-file',
type=str,
default=None,
help='Log file path. If None, output to stderr'
)
run_parser.add_argument(
'--data',
type=str,
default=None,
help='Path to h5ad file to load on startup'
)
run_parser.add_argument(
'-t', '--transport',
type=str,
default="stdio",
choices=["stdio", "sse"],
help='Transport type: stdio or sse. Default: stdio'
)
run_parser.add_argument(
'-p', '--port',
type=int,
default=8000,
help='Port for SSE transport. Default: 8000'
)
run_parser.add_argument(
'--host',
type=str,
default="127.0.0.1",
help='Host address for SSE transport. Default: 127.0.0.1'
)
# Set default subcommand to run
parser.set_defaults(command='run')
return parser.parse_args()
def run_cli():
"""CLI entry point function"""
args = parse_arguments()
# Ensure command is 'run'
if args.command == 'run':
# Get arguments
log_file = getattr(args, 'log_file', None)
data = getattr(args, 'data', None)
transport = getattr(args, 'transport', "stdio")
port = getattr(args, 'port', 8000)
host = getattr(args, 'host', "127.0.0.1")
# Set environment variables
if log_file is not None:
os.environ['SCVI_MCP_LOG_FILE'] = log_file
else:
os.environ['SCVI_MCP_LOG_FILE'] = ""
if data is not None:
os.environ['SCVI_MCP_DATA'] = data
else:
os.environ['SCVI_MCP_DATA'] = ""
os.environ['SCVI_MCP_TRANSPORT'] = transport
os.environ['SCVI_MCP_HOST'] = host
os.environ['SCVI_MCP_PORT'] = str(port)
try:
if transport == "stdio":
from .server import run_stdio
asyncio.run(run_stdio())
elif transport == "sse":
# For SSE transport, get application and run with uvicorn
from .server import create_sse_app
import uvicorn
app = create_sse_app(port=port)
uvicorn.run(app, host=host, port=port)
else:
print(f"Unsupported transport type: {transport}")
sys.exit(1)
except KeyboardInterrupt:
print("\nServer stopped")
sys.exit(0)
except Exception as e:
print(f"Server error: {e}")
sys.exit(1)
else:
print(f"Unknown command: {args.command}")
sys.exit(1)
if __name__ == "__main__":
run_cli()