Multiple_game_mcp / server.py
Joffrey Thomas
add chess
bea46e9
raw
history blame
2.06 kB
import contextlib
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from pokemon.pokemon_server import mcp as pokemon_mcp
from geoguessr.geo_server import mcp as geogussr_mcp
from chess_game.chess_server import mcp as chess_mcp
from geoguessr.web_app import app as geoguessr_app
from chess_game.web_app import app as chess_app
import os
# Create a combined lifespan to manage both session managers
@contextlib.asynccontextmanager
async def lifespan(app: FastAPI):
async with contextlib.AsyncExitStack() as stack:
await stack.enter_async_context(pokemon_mcp.session_manager.run())
await stack.enter_async_context(geogussr_mcp.session_manager.run())
await stack.enter_async_context(chess_mcp.session_manager.run())
yield
BASE_DIR = os.path.dirname(__file__)
STATIC_DIR = os.path.join(BASE_DIR, "static")
TEMPLATES_DIR = os.path.join(BASE_DIR, "templates")
app = FastAPI(lifespan=lifespan)
# Serve static assets (screenshot, styles)
app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static")
templates = Jinja2Templates(directory=TEMPLATES_DIR)
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
space_host = os.environ.get("SPACE_HOST")
if space_host and space_host.strip():
base_url = space_host.strip().rstrip("/")
else:
base_url = f"{request.url.scheme}://{request.url.netloc}"
return templates.TemplateResponse("index.html", {"request": request, "base_url": base_url})
app.mount("/geoguessr", geogussr_mcp.streamable_http_app())
app.mount("/Pokemon", pokemon_mcp.streamable_http_app())
app.mount("/chess", chess_mcp.streamable_http_app())
# Mount GeoGuessr FastAPI web app (UI + API)
app.mount("/geoguessr_app", geoguessr_app)
app.mount("/chess_app", chess_app)
PORT = int(os.environ.get("PORT", "10000"))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=PORT)