#!/usr/bin/env python3
"""PolicyGuard MCP server - Security & Governance for AI Agents.
This server provides security policy enforcement, audit logging, and
governance controls for AI agent deployments.
Usage Examples:
# Stdio mode (default MCP transport)
python src/main.py
# HTTP mode with MCP protocol over HTTP (for agentgateway)
python src/main.py --transport http
# Custom host/port
python src/main.py --transport http --host 0.0.0.0 --port 8000
# Environment variable mode
MCP_TRANSPORT_MODE=http python src/main.py
"""
import argparse
import logging
import os
import sys
from pathlib import Path
# Add src to Python path
sys.path.insert(0, str(Path(__file__).parent))
from core.server import DynamicMCPServer # noqa: E402
def main() -> None:
"""Main entry point for the MCP server."""
# Parse command line arguments
parser = argparse.ArgumentParser(
description="PolicyGuard - Security & Governance MCP Server"
)
parser.add_argument(
"--transport",
choices=["stdio", "http"],
default="stdio",
help="Transport mode: stdio (default), or http (for agentgateway)"
)
parser.add_argument(
"--host",
default=os.getenv("HOST", "0.0.0.0"),
help="Host to bind to in HTTP mode (default: 0.0.0.0)"
)
parser.add_argument(
"--port",
type=int,
default=int(os.getenv("PORT", "8000")),
help="Port to bind to in HTTP mode (default: 8000)"
)
args = parser.parse_args()
# Check environment variable for transport mode
transport_mode = os.getenv("MCP_TRANSPORT_MODE", args.transport)
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[
logging.StreamHandler(sys.stderr)
]
)
# Banner
logging.info("=" * 60)
logging.info("POLICYGUARD - Security & Governance MCP Server")
logging.info("=" * 60)
try:
# Create server with dynamic tool loading
server = DynamicMCPServer(
name="policyguard",
tools_dir="src/tools"
)
# Load tools and start server
server.load_tools()
if transport_mode not in ["http", "stdio"]:
raise ValueError(
f"Invalid transport mode: {transport_mode}. "
"Must be one of: http, stdio"
)
server.run(transport_mode=transport_mode, host=args.host, port=args.port)
except KeyboardInterrupt:
logging.info("\nPolicyGuard shutting down...")
except Exception as e:
logging.error(f"Server error: {e}", exc_info=True)
sys.exit(1)
if __name__ == "__main__":
main()