MCP Code Indexer

  • server
""" 服务器应用模块 提供MCP代码检索服务实现 """ import os import sys import logging import argparse import locale import asyncio # 设置控制台编码为UTF-8以解决编码问题 if sys.platform == 'win32': # Windows平台 os.system('chcp 65001') sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') else: # 其他平台 if locale.getpreferredencoding().upper() != 'UTF-8': locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # 将项目根目录添加到Python路径 sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # 从MCP库导入stdio_server函数 from mcp.server.stdio import stdio_server from mcp_code_indexer.config import Config from mcp_code_indexer.indexer import CodeIndexer from mcp_code_indexer.search_engine import SearchEngine from mcp_code_indexer.mcp_formatter import McpFormatter # 使用绝对导入,避免作为脚本直接运行时的问题 from server.mcp_server import setup_mcp_server # 创建日志过滤器 class MpcLogFilter(logging.Filter): """过滤MCP服务器的底层日志""" def filter(self, record): # 过滤掉MCP服务器的底层处理日志 if record.name.startswith('mcp.server.lowlevel'): return False return True # 禁用所有日志输出 class NullHandler(logging.Handler): def emit(self, record): pass # 配置空日志处理器 logging.basicConfig(handlers=[NullHandler()]) # 设置所有已知logger的级别为CRITICAL以上 logging.getLogger('mcp').setLevel(logging.CRITICAL) logging.getLogger('chromadb').setLevel(logging.CRITICAL) logging.getLogger('sentence_transformers').setLevel(logging.CRITICAL) logging.getLogger('tree_sitter').setLevel(logging.CRITICAL) logger = logging.getLogger(__name__) logger.setLevel(logging.CRITICAL) async def run_server(server): """ 运行带有stdio传输的MCP服务器 Args: server: MCP服务器实例 Returns: 无返回值 """ async with stdio_server() as (read_stream, write_stream): # 使用流运行服务器 from mcp.server.models import InitializationOptions from mcp.server.lowlevel import NotificationOptions init_options = InitializationOptions( server_name="mcp-code-indexer", server_version="0.1.0", capabilities=server.get_capabilities( notification_options=NotificationOptions(), experimental_capabilities={} ) ) await server.run(read_stream, write_stream, init_options) def main(): """ 主函数,启动MCP服务器 Returns: 无返回值 """ parser = argparse.ArgumentParser(description='MCP Code Retrieval Service') parser.add_argument('--config', type=str, help='Configuration file path') args = parser.parse_args() try: # 加载配置 config = Config(args.config) # 初始化组件 indexer = CodeIndexer(config) search_engine = SearchEngine(config, indexer) formatter = McpFormatter() # 创建MCP服务器 server = setup_mcp_server(config, indexer, search_engine, formatter) # 处理退出信号 def handle_exit(signum, frame): sys.exit(0) import signal signal.signal(signal.SIGINT, handle_exit) signal.signal(signal.SIGTERM, handle_exit) # 运行服务器 asyncio.run(run_server(server)) except KeyboardInterrupt: sys.exit(0) except Exception: sys.exit(1) if __name__ == '__main__': main()