"""命令行参数解析模块 - 统一管理 MCP 和 Web 服务的参数"""
import argparse
import os
from pathlib import Path
from typing import Optional
def create_base_parser(description: str, mode: str = "mcp") -> argparse.ArgumentParser:
"""创建基础参数解析器
Args:
description: 程序描述
mode: 模式,"mcp" 或 "web"
Returns:
配置好的参数解析器
"""
epilog_examples = {
"mcp": """
使用示例:
# 使用默认配置启动
python main.py
# 指定工作目录
python main.py --work-dir /path/to/project
# 指定批处理任务目录名
python main.py --batch-task-dir .my_batch
# 完整配置
python main.py --work-dir /path/to/project --batch-task-dir .batch --host 0.0.0.0 --port 8000
在 Cursor 的 mcp.json 中配置(类似 context7_local):
"novel-processor": {
"command": "uv",
"args": [
"--directory",
"E:\\\\Code\\\\Test\\\\小说\\\\测试\\\\fastmcp",
"run",
"main.py",
"--work-dir",
"E:\\\\Code\\\\Test\\\\小说\\\\项目A"
]
}
""",
"web": """
使用示例:
# 使用默认配置启动
python app.py
# 指定工作目录
python app.py --work-dir /path/to/project
# 指定批处理任务目录名
python app.py --batch-task-dir .my_batch
# 完整配置
python app.py --work-dir /path/to/project --batch-task-dir .batch --host 0.0.0.0 --port 8000
启动脚本使用:
run-server.bat "E:\\Code\\Test\\小说\\项目A"
"""
}
parser = argparse.ArgumentParser(
description=description,
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=epilog_examples.get(mode, epilog_examples["mcp"])
)
return parser
def add_common_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
"""添加通用参数
Args:
parser: 参数解析器
Returns:
添加了通用参数的解析器
"""
from config import SERVER_HOST, SERVER_PORT, MCP_MOUNT_PATH
# 工作目录配置
parser.add_argument(
'--work-dir',
type=str,
help='工作目录路径(存放项目文件和配置)'
)
parser.add_argument(
'--batch-task-dir',
type=str,
default='.batch_task',
help='批处理任务目录名(默认: .batch_task)'
)
# 服务器配置
parser.add_argument(
'--host',
type=str,
default=SERVER_HOST,
help=f'服务器主机地址(默认: {SERVER_HOST})'
)
parser.add_argument(
'--port',
type=int,
default=SERVER_PORT,
help=f'服务器端口(默认: {SERVER_PORT})'
)
# 日志配置
parser.add_argument(
'--log-level',
type=str,
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
default='INFO',
help='日志级别(默认: INFO)'
)
return parser
def add_mcp_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
"""添加 MCP 特有的参数
Args:
parser: 参数解析器
Returns:
添加了 MCP 参数的解析器
"""
from config import MCP_MOUNT_PATH
parser.add_argument(
'--mcp-path',
type=str,
default=MCP_MOUNT_PATH,
help=f'MCP 挂载路径(默认: {MCP_MOUNT_PATH})'
)
return parser
def parse_args(mode: str = "mcp") -> argparse.Namespace:
"""解析命令行参数
Args:
mode: 模式,"mcp" 或 "web"
Returns:
解析后的参数命名空间
"""
descriptions = {
"mcp": "小说处理 MCP 服务器",
"web": "小说处理 Web 服务器"
}
parser = create_base_parser(
description=descriptions.get(mode, descriptions["mcp"]),
mode=mode
)
# 添加通用参数
add_common_arguments(parser)
# 添加 MCP 特有参数
if mode == "mcp":
add_mcp_arguments(parser)
return parser.parse_args()
def setup_environment(args: argparse.Namespace) -> None:
"""根据参数设置环境变量
Args:
args: 解析后的参数
"""
# 设置工作目录
if args.work_dir:
os.environ['BATCH_WORK_DIR'] = args.work_dir
# 设置批处理任务目录名
if hasattr(args, 'batch_task_dir') and args.batch_task_dir:
os.environ['BATCH_TASK_DIR'] = args.batch_task_dir
# 设置服务器配置
os.environ['SERVER_HOST'] = args.host
os.environ['SERVER_PORT'] = str(args.port)
# 设置 MCP 路径(如果存在)
if hasattr(args, 'mcp_path'):
os.environ['MCP_MOUNT_PATH'] = args.mcp_path
def ensure_work_directory(args: argparse.Namespace) -> Optional[Path]:
"""确保工作目录存在
Args:
args: 解析后的参数
Returns:
工作目录路径,如果未指定则返回 None
"""
from config import ensure_directories
if args.work_dir:
work_dir_path = Path(args.work_dir)
ensure_directories(work_dir_path)
return work_dir_path
else:
ensure_directories()
return None
def get_log_level(args: argparse.Namespace) -> int:
"""获取日志级别
Args:
args: 解析后的参数
Returns:
日志级别常量
"""
import logging
return getattr(logging, args.log_level)
__all__ = [
'create_base_parser',
'add_common_arguments',
'add_mcp_arguments',
'parse_args',
'setup_environment',
'ensure_work_directory',
'get_log_level',
]