MCP Code Indexer

  • client
""" 命令行接口模块 提供MCP代码检索服务的命令行工具 """ import os import sys import argparse import logging import json from typing import Dict, Any, List, Optional import time from .plugin import McpPlugin # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.StreamHandler(), logging.FileHandler('mcp_indexer_cli.log') ] ) logger = logging.getLogger(__name__) def setup_parser() -> argparse.ArgumentParser: """ 设置命令行参数解析器 Returns: 参数解析器对象 """ parser = argparse.ArgumentParser(description='MCP代码检索工具') subparsers = parser.add_subparsers(dest='command', help='子命令') # 服务器URL参数 parser.add_argument('--server', type=str, default='http://127.0.0.1:5000', help='MCP服务器URL') # 识别项目命令 identify_parser = subparsers.add_parser('identify', help='识别项目') identify_parser.add_argument('--path', type=str, default=os.getcwd(), help='项目路径') # 索引项目命令 index_parser = subparsers.add_parser('index', help='索引项目') index_parser.add_argument('--path', type=str, default=os.getcwd(), help='项目路径') index_parser.add_argument('--wait', action='store_true', help='等待索引完成') index_parser.add_argument('--timeout', type=int, default=300, help='等待超时时间(秒)') # 搜索代码命令 search_parser = subparsers.add_parser('search', help='搜索代码') search_parser.add_argument('query', type=str, help='查询字符串') search_parser.add_argument('--project-id', type=str, help='项目ID') search_parser.add_argument('--language', type=str, help='编程语言') search_parser.add_argument('--file-path', type=str, help='文件路径') search_parser.add_argument('--limit', type=int, default=10, help='返回结果数量限制') # 获取代码上下文命令 context_parser = subparsers.add_parser('context', help='获取代码上下文') context_parser.add_argument('--file', type=str, required=True, help='文件路径') context_parser.add_argument('--line', type=int, required=True, help='行号') context_parser.add_argument('--context-lines', type=int, default=10, help='上下文行数') # 获取项目列表命令 subparsers.add_parser('projects', help='获取项目列表') # 删除项目索引命令 delete_parser = subparsers.add_parser('delete', help='删除项目索引') delete_parser.add_argument('project_id', type=str, help='项目ID') # 健康检查命令 subparsers.add_parser('health', help='检查服务器健康状态') return parser def handle_identify(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理识别项目命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ result = plugin.identify_project(args.path) print(json.dumps(result, indent=2)) def handle_index(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理索引项目命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ result = plugin.index_project(args.path, args.wait, args.timeout) print(json.dumps(result, indent=2)) def handle_search(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理搜索代码命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ # 构建过滤条件 filters = {} if args.language: filters['language'] = args.language if args.file_path: filters['file_path'] = args.file_path # 构建项目ID列表 project_ids = [args.project_id] if args.project_id else None # 执行搜索 result = plugin.search(args.query, project_ids, filters, args.limit) # 输出结果 if args.project_id: # 格式化输出 print(plugin.format_for_ai(result)) else: # JSON输出 print(json.dumps(result, indent=2)) def handle_context(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理获取代码上下文命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ result = plugin.get_code_context(args.file, args.line, args.context_lines) print(json.dumps(result, indent=2)) def handle_projects(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理获取项目列表命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ result = plugin.get_projects() print(json.dumps(result, indent=2)) def handle_delete(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理删除项目索引命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ result = plugin.delete_project(args.project_id) print(json.dumps(result, indent=2)) def handle_health(plugin: McpPlugin, args: argparse.Namespace) -> None: """ 处理健康检查命令 Args: plugin: MCP插件对象 args: 命令行参数 Returns: 无返回值 """ is_healthy = plugin.health_check() if is_healthy: print("服务器状态: 正常") else: print("服务器状态: 异常") sys.exit(1) def main(): """ 主函数,处理命令行参数并执行相应操作 Returns: 无返回值 """ parser = setup_parser() args = parser.parse_args() # 如果没有指定命令,显示帮助信息 if not args.command: parser.print_help() return # 创建MCP插件 plugin = McpPlugin(args.server) # 处理命令 command_handlers = { 'identify': handle_identify, 'index': handle_index, 'search': handle_search, 'context': handle_context, 'projects': handle_projects, 'delete': handle_delete, 'health': handle_health } if args.command in command_handlers: try: command_handlers[args.command](plugin, args) except Exception as e: logger.error(f"命令执行失败: {str(e)}") print(f"错误: {str(e)}") sys.exit(1) else: parser.print_help() if __name__ == '__main__': main()