Coverage for fastblocks/mcp/server.py: 20%

60 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-09 00:47 -0700

1"""FastBlocks MCP (Model Context Protocol) server implementation. 

2 

3Provides IDE/AI assistant integration for FastBlocks capabilities including: 

4- Template management and validation 

5- Component creation and discovery 

6- Adapter configuration and health checks 

7""" 

8 

9import logging 

10from contextlib import suppress 

11from typing import Any 

12 

13logger = logging.getLogger(__name__) 

14 

15 

16class FastBlocksMCPServer: 

17 """FastBlocks MCP protocol server using ACB infrastructure.""" 

18 

19 def __init__(self, name: str = "fastblocks", version: str = "0.16.0"): 

20 """Initialize FastBlocks MCP server. 

21 

22 Args: 

23 name: Server name for MCP protocol 

24 version: FastBlocks version 

25 """ 

26 self.name = name 

27 self.version = version 

28 self._server: Any | None = None 

29 self._initialized = False 

30 

31 async def initialize(self) -> None: 

32 """Initialize MCP server with ACB integration.""" 

33 if self._initialized: 

34 return 

35 

36 try: 

37 # Import ACB MCP utilities 

38 from acb import HAS_MCP 

39 

40 if not HAS_MCP: 

41 logger.warning("ACB MCP support not available - server disabled") 

42 return 

43 

44 from acb import create_mcp_server 

45 

46 # Create server using ACB infrastructure 

47 # Note: ACB MCP API may differ - this is a stub implementation 

48 self._server = create_mcp_server( # type: ignore[call-arg] 

49 name=self.name, 

50 version=self.version, 

51 description="FastBlocks MCP Server for IDE Integration", 

52 ) 

53 

54 # Register FastBlocks tools and resources 

55 await self._register_tools() 

56 await self._register_resources() 

57 

58 self._initialized = True 

59 logger.info( 

60 f"FastBlocks MCP server initialized: {self.name} v{self.version}" 

61 ) 

62 

63 except ImportError: 

64 logger.debug("ACB MCP dependencies not available - graceful degradation") 

65 except Exception as e: 

66 logger.error(f"Failed to initialize MCP server: {e}") 

67 

68 async def _register_tools(self) -> None: 

69 """Register FastBlocks MCP tools. 

70 

71 Tools will be implemented in tools.py and registered here. 

72 """ 

73 with suppress(Exception): 

74 from .tools import register_fastblocks_tools 

75 

76 await register_fastblocks_tools(self._server) 

77 logger.debug("FastBlocks MCP tools registered") 

78 

79 async def _register_resources(self) -> None: 

80 """Register FastBlocks MCP resources. 

81 

82 Resources will be implemented in resources.py and registered here. 

83 """ 

84 with suppress(Exception): 

85 from .resources import register_fastblocks_resources 

86 

87 await register_fastblocks_resources(self._server) 

88 logger.debug("FastBlocks MCP resources registered") 

89 

90 async def start(self) -> None: 

91 """Start the MCP server.""" 

92 if not self._initialized: 

93 await self.initialize() 

94 

95 if self._server is None: 

96 logger.warning("MCP server not available - skipping start") 

97 return 

98 

99 try: 

100 logger.info("Starting FastBlocks MCP server...") 

101 await self._server.run() 

102 except Exception as e: 

103 logger.error(f"MCP server error: {e}") 

104 raise 

105 

106 async def stop(self) -> None: 

107 """Stop the MCP server gracefully.""" 

108 if self._server is None: 

109 return 

110 

111 try: 

112 logger.info("Stopping FastBlocks MCP server...") 

113 # Server shutdown will be handled by ACB 

114 await self._server.stop() 

115 except Exception as e: 

116 logger.error(f"Error stopping MCP server: {e}") 

117 

118 

119async def create_fastblocks_mcp_server() -> FastBlocksMCPServer: 

120 """Create and initialize FastBlocks MCP server. 

121 

122 Returns: 

123 Initialized FastBlocksMCPServer instance 

124 

125 Example: 

126 >>> server = await create_fastblocks_mcp_server() 

127 >>> await server.start() 

128 """ 

129 server = FastBlocksMCPServer() 

130 await server.initialize() 

131 return server