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
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-09 00:47 -0700
1"""FastBlocks MCP (Model Context Protocol) server implementation.
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"""
9import logging
10from contextlib import suppress
11from typing import Any
13logger = logging.getLogger(__name__)
16class FastBlocksMCPServer:
17 """FastBlocks MCP protocol server using ACB infrastructure."""
19 def __init__(self, name: str = "fastblocks", version: str = "0.16.0"):
20 """Initialize FastBlocks MCP server.
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
31 async def initialize(self) -> None:
32 """Initialize MCP server with ACB integration."""
33 if self._initialized:
34 return
36 try:
37 # Import ACB MCP utilities
38 from acb import HAS_MCP
40 if not HAS_MCP:
41 logger.warning("ACB MCP support not available - server disabled")
42 return
44 from acb import create_mcp_server
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 )
54 # Register FastBlocks tools and resources
55 await self._register_tools()
56 await self._register_resources()
58 self._initialized = True
59 logger.info(
60 f"FastBlocks MCP server initialized: {self.name} v{self.version}"
61 )
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}")
68 async def _register_tools(self) -> None:
69 """Register FastBlocks MCP tools.
71 Tools will be implemented in tools.py and registered here.
72 """
73 with suppress(Exception):
74 from .tools import register_fastblocks_tools
76 await register_fastblocks_tools(self._server)
77 logger.debug("FastBlocks MCP tools registered")
79 async def _register_resources(self) -> None:
80 """Register FastBlocks MCP resources.
82 Resources will be implemented in resources.py and registered here.
83 """
84 with suppress(Exception):
85 from .resources import register_fastblocks_resources
87 await register_fastblocks_resources(self._server)
88 logger.debug("FastBlocks MCP resources registered")
90 async def start(self) -> None:
91 """Start the MCP server."""
92 if not self._initialized:
93 await self.initialize()
95 if self._server is None:
96 logger.warning("MCP server not available - skipping start")
97 return
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
106 async def stop(self) -> None:
107 """Stop the MCP server gracefully."""
108 if self._server is None:
109 return
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}")
119async def create_fastblocks_mcp_server() -> FastBlocksMCPServer:
120 """Create and initialize FastBlocks MCP server.
122 Returns:
123 Initialized FastBlocksMCPServer instance
125 Example:
126 >>> server = await create_fastblocks_mcp_server()
127 >>> await server.start()
128 """
129 server = FastBlocksMCPServer()
130 await server.initialize()
131 return server