MCP Development Server
by dillip285
- src
- mcp_dev_server
"""MCP Development Server implementation."""
from typing import Dict, Any, Optional, Sequence
import logging
import sys
import json
# Import MCP components
from mcp.server import Server as MCPServer
from mcp.server.stdio import stdio_server
import mcp.types as types
from .models import Config, InputResponse, MCPDevServerError
from .managers import (
ProjectManager,
TemplateManager,
BuildManager,
DependencyManager,
TestManager,
WorkflowManager
)
from .handlers import InputRequestHandler
# Configure logging to stderr to keep stdout clean
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(sys.stderr)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG) # Set to DEBUG for development
class MCPDevServer:
"""MCP Development Server implementation."""
def __init__(self):
"""Initialize the MCP Development Server."""
logger.info("Initializing MCP Development Server")
try:
# Initialize server
self.server = MCPServer("mcp-dev-server")
# Initialize configuration
self.config = Config()
# Initialize all managers
self.project_manager = ProjectManager(self.config)
self.template_manager = TemplateManager()
self.build_manager = BuildManager()
self.dependency_manager = DependencyManager()
self.test_manager = TestManager()
self.workflow_manager = WorkflowManager()
self.input_handler = InputRequestHandler()
# Setup request handlers
self._setup_resource_handlers()
self._setup_tool_handlers()
self._setup_prompt_handlers()
logger.info("Server initialization completed successfully")
except Exception as e:
logger.error(f"Failed to initialize server: {e}")
raise
def _setup_resource_handlers(self):
"""Set up resource request handlers."""
@self.server.list_resources()
async def list_resources() -> list[types.Resource]:
"""List available resources."""
logger.debug("Listing resources")
return []
@self.server.read_resource()
async def read_resource(uri: str) -> str:
"""Read resource content."""
logger.debug(f"Reading resource: {uri}")
return ""
def _setup_tool_handlers(self):
"""Set up tool request handlers."""
@self.server.list_tools()
async def list_tools() -> list[types.Tool]:
"""List available tools."""
logger.debug("Listing tools")
return []
@self.server.call_tool()
async def call_tool(name: str, arguments: Dict[str, Any]) -> Sequence[types.TextContent]:
"""Execute a tool."""
logger.debug(f"Calling tool {name} with arguments {arguments}")
return [types.TextContent(type="text", text="Tool execution result")]
def _setup_prompt_handlers(self):
"""Set up prompt request handlers."""
@self.server.list_prompts()
async def list_prompts() -> list[types.Prompt]:
"""List available prompts."""
logger.debug("Listing prompts")
return []
async def run(self):
"""Run the MCP Development Server."""
try:
logger.info(f"Starting {self.server.name}...")
# Use stdio transport
async with stdio_server() as streams:
logger.info("Using stdio transport")
await self.server.run(
streams[0], # read stream
streams[1], # write stream
self.server.create_initialization_options(),
raise_exceptions=True # Enable for debugging
)
except Exception as e:
logger.error(f"Server error: {str(e)}")
raise MCPDevServerError(f"Server error: {str(e)}")
finally:
logger.info("Server shutdown")