"""Standards MCP Server.
This is the main entry point for the Standards MCP Server. It can run in two modes:
1. stdio transport - For Claude Code and local development
2. Streamable HTTP transport - For remote/production deployment
The server provides:
- Resources: Standards documentation exposed via MCP resources
- Tools: Validation tools for checking compliance with standards
"""
from fastmcp import FastMCP
from .config import get_config
from .observability import configure_opentelemetry, configure_logging
from .resources import standards_router, implementations_router
from .tools import validation_router, search_router
# Initialize configuration
config = get_config()
# Configure observability first
configure_opentelemetry(config)
configure_logging(config)
# Create main MCP server
mcp = FastMCP(
name=config.server_name,
version=config.server_version,
instructions="""
Standards MCP Server - Your guide to Darwin platform standards.
This server provides access to platform standards documentation,
reference implementations, and tools for validating compliance.
Resources:
- standards://agents/* - Agent design and implementation standards
- standards://mcp/* - MCP server and tool standards
- templates://mcp/python - Python MCP server template
- templates://mcp/dotnet - .NET MCP server template
- implementations://mcp/* - MCP server implementations
- implementations://agents/* - Agent implementations
- implementations://a2a/* - A2A protocol implementations
Tools:
- validate_azure_resource_name - Validate Azure resource naming
- validate_mcp_tool_definition - Validate MCP tool definitions
- validate_agent_card - Validate A2A agent cards
- search_standards - Search standards documentation
- list_standards_categories - List available categories
- get_standards_summary - Get category summaries
"""
)
# Mount sub-servers for resources and tools
mcp.mount(standards_router)
mcp.mount(implementations_router)
mcp.mount(validation_router)
mcp.mount(search_router)
def main():
"""Run the MCP server.
Transport mode is determined by MCP_TRANSPORT environment variable:
- 'stdio' (default): For Claude Code and local development
- 'http': For remote deployment with Streamable HTTP transport
"""
import structlog
logger = structlog.get_logger()
logger.info(
"Starting Standards MCP Server",
server_name=config.server_name,
version=config.server_version,
transport=config.transport,
standards_path=str(config.get_standards_root()),
implementations_path=str(config.get_reference_implementations_root())
)
# Validate standards path exists
standards_root = config.get_standards_root()
if not standards_root.exists():
logger.warning(
"Standards directory not found",
path=str(standards_root),
note="Standards resources will return errors"
)
# Validate implementations path exists
impl_root = config.get_reference_implementations_root()
if not impl_root.exists():
logger.warning(
"Reference implementations directory not found",
path=str(impl_root),
note="Implementation resources will return errors"
)
# Run with appropriate transport
if config.transport == "http":
logger.info(
"Starting Streamable HTTP transport",
host=config.host,
port=config.port
)
mcp.run(
transport="http",
host=config.host,
port=config.port
)
else:
logger.info("Starting stdio transport")
mcp.run(transport="stdio")
if __name__ == "__main__":
main()