Skip to main content
Glama

MCP Server

by hburgoyne
main.py3.26 kB
from fastapi import FastAPI, Depends, HTTPException, status from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles import os from pathlib import Path from dotenv import load_dotenv from app.utils.logger import logger, setup_logger from app.core.config import settings import time import uuid # Load environment variables load_dotenv() # Set up application logger app_logger = setup_logger("mcp_server", os.getenv("LOG_LEVEL", "INFO")) # Log application startup logger.info(f"Starting {settings.PROJECT_NAME} server") # Create FastAPI app app = FastAPI( title=settings.PROJECT_NAME, description="Model Context Protocol (MCP) server for memory management", version="0.1.0", docs_url="/docs", redoc_url="/redoc", openapi_url="/openapi.json", ) # Configure Jinja2 templates templates = Jinja2Templates(directory="app/templates") # Make templates available globally from app.core.config import settings settings.TEMPLATES = templates # Mount static files app.mount("/static", StaticFiles(directory="app/static"), name="static") # Request ID middleware for tracing @app.middleware("http") async def add_request_id_middleware(request, call_next): """ Middleware to add a unique request ID to each request for tracing. """ request_id = str(uuid.uuid4()) start_time = time.time() # Add request ID to the request state request.state.request_id = request_id # Log incoming request logger.info(f"Request started: {request.method} {request.url.path} (ID: {request_id})") # Process the request response = await call_next(request) # Calculate request duration process_time = (time.time() - start_time) * 1000 response.headers["X-Request-ID"] = request_id response.headers["X-Process-Time"] = str(process_time) # Log completed request logger.info(f"Request completed: {request.method} {request.url.path} - {response.status_code} in {process_time:.2f}ms (ID: {request_id})") return response # Configure CORS app.add_middleware( CORSMiddleware, allow_origins=settings.BACKEND_CORS_ORIGINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Add OAuth token validation middleware from app.middleware.oauth import verify_token_middleware app.middleware("http")(verify_token_middleware) # Root endpoint @app.get("/", tags=["Root"]) async def root(): return { "message": f"Welcome to {settings.PROJECT_NAME} Server", "documentation": "/docs", "version": "0.1.0" } # Import and include the API router from app.api.api import api_router app.include_router(api_router, prefix=settings.API_V1_STR) # Start the application using Uvicorn if this file is run directly if __name__ == "__main__": import uvicorn logger.info(f"Starting Uvicorn server at {settings.MCP_SERVER_HOST}:{settings.MCP_SERVER_PORT}") uvicorn.run( "app.main:app", host=os.getenv("MCP_SERVER_HOST", "0.0.0.0"), port=int(os.getenv("MCP_SERVER_PORT", "8000")), reload=True, log_level=os.getenv("LOG_LEVEL", "info").lower(), )

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hburgoyne/picard_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server