7935b671d3
Exposes homelab topology to MCP-compatible AI clients (Claude Code, etc.) over LAN via HTTP/SSE on port 8001. - New mcp/ service: FastAPI + mcp SDK, SSE transport - Auth: X-API-Key for AI clients, X-MCP-Service-Key for backend (Docker-internal) - Resources: canvas, nodes, edges, scan/pending, scan/runs - Tools: create/update/delete nodes+edges, trigger scan, approve/hide devices - Backend deps.py: accepts JWT or MCP service key (no plain-text password) - 40 tests (auth, resources, tools) across asyncio + trio - docker-compose.yml: mcp service on port 8001 - README: MCP setup section with Claude Code/Desktop config examples
22 lines
711 B
Python
22 lines
711 B
Python
import hmac
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
from starlette.requests import Request
|
|
from starlette.responses import JSONResponse
|
|
|
|
from .config import settings
|
|
|
|
|
|
class ApiKeyMiddleware(BaseHTTPMiddleware):
|
|
async def dispatch(self, request: Request, call_next):
|
|
# Health check bypass
|
|
if request.url.path == "/health":
|
|
return await call_next(request)
|
|
|
|
key = request.headers.get("X-API-Key", "")
|
|
expected = settings.mcp_api_key
|
|
|
|
if not key or not hmac.compare_digest(key.encode(), expected.encode()):
|
|
return JSONResponse({"detail": "Invalid or missing X-API-Key"}, status_code=401)
|
|
|
|
return await call_next(request)
|