diff --git a/tasks/todo.md b/tasks/todo.md index e178622c..bd4ecab5 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -1,131 +1,3 @@ -# MCP Server → Azure Container App (Remote Deployment) +# Tasks -## Ziel -MCP Server als Remote-Service auf Azure Container Apps deployen (`autopilotmonitor-mcp`), damit OAuth mit richtiger Redirect URI funktioniert und kein lokaler Device Code Flow nötig ist. - -## Plan - -### Phase 1: Transport umstellen (stdio → Streamable HTTP) -- [ ] `index.ts` auf HTTP/SSE Transport umstellen (MCP SDK `StreamableHTTPServerTransport`) -- [ ] Health-Check Endpoint `/health` hinzufügen -- [ ] Port konfigurierbar via `PORT` env var (default 8080) -- [ ] Auth-Strategie anpassen: Remote Server braucht keinen Device Code Flow — der **Claude Code Client** übernimmt die OAuth-Authentifizierung und sendet das Token im MCP-Protokoll - -### Phase 2: Zugriffskontrolle (MCP Access Policy + User Whitelist) -- [ ] Shared: `McpAccessPolicy` Enum — `Disabled`, `WhitelistOnly`, `AllMembers` -- [ ] Shared: `AdminConfiguration.McpAccessPolicy` Property (Default: `WhitelistOnly`) -- [ ] Backend: `McpUsers` Table Storage (Pattern wie `GlobalAdmins`) — PartitionKey="McpUsers", RowKey=UPN -- [ ] Backend: `McpUserService` mit Cache (5min TTL), `IsAllowedAsync(upn)` prüft Policy: - - `Disabled` → immer false - - `WhitelistOnly` → GlobalAdmin ODER McpUsers-Eintrag - - `AllMembers` → jeder authentifizierte User -- [ ] Backend: `McpUserFunction` — CRUD Endpoints (`GET/POST/DELETE /api/admin/mcp-users`), Policy: `GlobalAdminOnly` -- [ ] Backend: `GET /api/admin/mcp-users/check` — für MCP Server Auth-Check (lightweight, cached) -- [ ] Backend: Endpoints in `EndpointAccessPolicyCatalog` registrieren -- [ ] MCP Server: Token-Validierung Middleware — JWT prüfen, UPN extrahieren, gegen Backend `/api/admin/mcp-users/check` validieren -- [ ] MCP Server: Per-User Rate Limiting (in-memory, z.B. 60 req/min pro UPN, konfigurierbar via `MCP_RATE_LIMIT_PER_MINUTE`) - -### Phase 3: Container-Setup -- [ ] `Dockerfile` erstellen (Node.js slim, multi-stage build, mit `@huggingface/transformers`) -- [ ] `.dockerignore` erstellen -- [ ] Lokal testen: `docker build` + `docker run` - -### Phase 4: Azure Container App Deployment -- [ ] Container App Konfiguration (YAML oder Bicep) erstellen -- [ ] Environment Variables definieren (`AUTOPILOT_API_URL`, `PORT`, etc.) -- [ ] Container App erstellen: `autopilotmonitor-mcp` -- [ ] VS Code Azure Extension: Deploy to Container App testen - -### Phase 5: OAuth für Remote MCP -- [ ] Entra App Registration: Redirect URI auf Container App URL setzen -- [ ] MCP Server OAuth Provider Metadata implementieren (`/.well-known/oauth-authorization-server`) -- [ ] Claude Code `.mcp.json` auf Remote URL umstellen - -### Phase 6: Web UI — MCP Verwaltung -- [ ] Settings-Seite: MCP Access Policy Toggle (Disabled / WhitelistOnly / AllMembers) -- [ ] Settings-Seite: MCP Users Section (nur sichtbar wenn Policy = WhitelistOnly) - - [ ] User-Liste mit UPN, AddedBy, AddedDate, IsEnabled - - [ ] Add User (UPN Eingabe + Add Button) - - [ ] Remove User (Delete Button mit Confirmation) - - [ ] Enable/Disable Toggle -- [ ] Success/Error Notifications (bestehendes Pattern mit `error`/`successMessage` State) - -### Phase 7: Aufräumen & Test -- [ ] Device Code Flow Code entfernen (nicht mehr nötig bei Remote) -- [ ] Lokale stdio-Variante als Fallback behalten? (Entscheidung) -- [ ] End-to-End Test: MCP Tools aus VS Code Claude Extension aufrufen - -## Architektur-Entscheidungen - -- **Container Apps Consumption Plan** — Scale to Zero, praktisch kostenlos bei sporadischer Nutzung -- **Name**: `autopilotmonitor-mcp` (konsistent mit `autopilotmonitor-api`) -- **Search Backend**: Vector Search (`@huggingface/transformers`, Xenova/all-MiniLM-L6-v2) — semantische Suche über Rules/Knowledge Base -- **Auth**: OAuth wird vom Claude Code Client gehandhabt — der MCP Server validiert das Bearer Token -- **Zugriffskontrolle**: 3-stufige Policy via `AdminConfiguration.McpAccessPolicy` - - `Disabled` — MCP komplett aus - - `WhitelistOnly` (Default) — GlobalAdmins + explizit freigeschaltete McpUsers - - `AllMembers` — jeder authentifizierte User - - Pattern identisch zu `GlobalAdmins` Table (UPN-basiert, IsEnabled Flag, Cache) - - GlobalAdmins haben automatisch Zugriff (kein separater Eintrag nötig) - - Policy-Wechsel = Config-Flip im Settings UI, kein Deployment nötig - ---- - -# Data Access Layer — Migration Plan (abgeschlossen) - -
-Phase 1-4 ✅ abgeschlossen - -## Phase 1: Foundation ✅ -- [x] Define 10 Repository Interfaces in `Shared/DataAccess/` -- [x] Define `IDataEventPublisher` + `NullDataEventPublisher` -- [x] Define `IStorageInitializer` -- [x] Create Table Storage implementations -- [x] Create `DataAccessServiceExtensions` with `AddTableStorageDataAccess()` -- [x] Register DAL in `Program.cs` - -## Phase 2: Migrate Core Functions ✅ -- [x] All 11 Session Functions → `ISessionRepository` -- [x] All Metrics Functions → `IMetricsRepository` / `IMaintenanceRepository` -- [x] All Admin/Audit Functions → `IMaintenanceRepository` -- [x] All Rules Functions → `IRuleRepository` -- [x] IngestEventsFunction → 5 repositories -- [x] Auth, Progress, Feedback Functions → appropriate repos - -## Phase 2b: Migrate Domain Services ✅ -- [x] `RuleEngine`, `AnalyzeRuleService`, `GatherRuleService`, `ImeLogPatternService` → `IRuleRepository` -- [x] `UsageMetricsService` → `IMetricsRepository` + `IMaintenanceRepository` -- [x] `PlatformMetricsService` → `ISessionRepository` -- [x] `MaintenanceService` → `IMaintenanceRepository` + `ISessionRepository` + `IMetricsRepository` - -## Phase 3: Migrate GetTableClient Users ✅ -- [x] All 8 Vulnerability Functions → `IVulnerabilityRepository` -- [x] `ReseedFromGitHubFunction` → `IVulnerabilityRepository` + `IRuleRepository` -- [x] `ApiKeyManagementFunction` + `ApiKeyMiddleware` → `IAdminRepository` - -## Phase 4: Migrate Bypass Services ✅ -- [x] `TenantConfigurationService` → `IConfigRepository` -- [x] `AdminConfigurationService` → `IConfigRepository` -- [x] `PreviewWhitelistService` → `IConfigRepository` -- [x] `TelegramNotificationService` → `IConfigRepository` -- [x] `GlobalAdminService` → `IAdminRepository` -- [x] `TenantAdminsService` → `IAdminRepository` -- [x] `BootstrapSessionService` → `IBootstrapRepository` -- [x] `GlobalNotificationService` → `INotificationRepository` -- [x] `SessionReportService` → `INotificationRepository` -- [x] `BlockedDeviceService` → `IDeviceSecurityRepository` -- [x] `BlockedVersionService` → `IDeviceSecurityRepository` -- [x] `VulnerabilityCorrelationService` → `IVulnerabilityRepository` - -
- -## Phase 5: Event Streaming (When Ready) -- [ ] Implement `EventHubPublisher` (or `ServiceBusPublisher`) -- [ ] Register via `services.AddEventStreaming()` -- [ ] Define event schemas for key domain events - -## Phase 6: Cosmos DB Migration (When Ready) -- [ ] Create `CosmosSessionRepository`, `CosmosRuleRepository`, etc. -- [ ] Create `AddCosmosDataAccess()` extension method -- [ ] Replace inverted-tick indexing with native ORDER BY DESC -- [ ] Swap `AddTableStorageDataAccess()` → `AddCosmosDataAccess()` in Program.cs +_Keine offenen Tasks._