From 3c8e41b3f8dcce811db496c73e8c0efefd588ae4 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Thu, 23 Jul 2026 23:02:33 +0200 Subject: [PATCH] docs: update PROGRESS.md with Phase 5 Batch 4 completion (Tasks 5.16-5.17) --- PROGRESS.md | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/PROGRESS.md b/PROGRESS.md index 09eaf9a..a372099 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -295,3 +295,96 @@ Siehe `MASTER-PLAN.md` für alle Tasks. - `app/plugins/builtins/system_notif/plugin.py` — backup.completed/failed events + handler methods **Phase 5 Batch 3 Gesamt: ✅ Complete** + +--- + +## Phase 5 Batch 4: MCP Server & Client Integration (Tasks 5.16-5.17) ✅ + +### Task 5.16: MCP-Server Integration (10h) ✅ + +LeoCRM als MCP-Server: Externe Tools (Claude Desktop, andere KI-Clients) können auf LeoCRM-Daten zugreifen. + +**Neues Plugin `app/plugins/builtins/mcp_server/`:** +- `plugin.py` — PluginManifest (name='mcp_server', dependencies=['permissions'], permissions=['mcp:read','mcp:write']) +- `routes.py` — 3 Endpoints: + - `GET /api/v1/mcp/tools` — Listet alle 9 MCP-Tools mit Schema + - `POST /api/v1/mcp/tools/{tool_name}/execute` — Führt MCP-Tool aus (mit RBAC) + - `GET /api/v1/mcp/config` — MCP-Server-Konfiguration für externe Clients +- `tool_definitions.py` — 9 MCP-Tool-Definitionen: + - `search_contacts` — Kontakte durchsuchen (query, limit) + - `get_contact` — Kontakt Details abrufen (contact_id) + - `create_contact` — Neuen Kontakt erstellen (name, email, phone, type) + - `list_calendar_entries` — Kalendereinträge auflisten (date_from, date_to) + - `create_calendar_entry` — Termin erstellen (title, start, end) + - `list_emails` — E-Mails auflisten (folder, limit) + - `send_email` — E-Mail senden (to, subject, body) + - `list_files` — DMS-Dateien auflisten (folder_id) + - `upload_file` — Datei hochladen (filename, content_base64) +- `schemas.py` — Pydantic schemas (McpToolDefinition, McpToolExecuteRequest/Response, McpServerConfig) +- `migrations/0001_initial.sql` — Stateless plugin (no tables needed) +- Auth: Session-based auth + RBAC permission check per tool + +**Frontend:** +- `frontend/src/api/mcp.ts` — API client with React Query hooks (useMcpTools, useMcpConfig, useExecuteMcpTool) +- `frontend/src/pages/SettingsMcp.tsx` — MCP Settings page with tool listing, execution UI, and server config +- `frontend/src/routes/index.tsx` — Added /settings/mcp route +- `frontend/src/pages/Settings.tsx` — Added MCP nav item +- i18n: de.json + en.json updated with mcp.server.* and mcp.client.* keys + +**Tests:** `tests/test_mcp_server.py` — 7 tests (all passing) +- AC1: List MCP tools (9 tools) +- AC2: Get MCP config +- AC3: Execute search_contacts +- AC4: Non-existent tool returns 404 +- AC5: Tool definitions schema validation +- AC6: Unauthorized access rejected +- AC7: Execute create_contact + +### Task 5.17: MCP-Client Integration (6h) ✅ + +LeoCRM-Agenten können externe MCP-Server nutzen (Web-Search, Code-Execution, externe Datenquellen). + +**Neues Plugin `app/plugins/builtins/mcp_client/`:** +- `plugin.py` — PluginManifest (name='mcp_client', dependencies=['permissions'], permissions=['mcp-client:read','mcp-client:write','mcp-client:admin']) +- `models.py` — McpServerConfig Model (name, url, api_token, enabled, tenant_id) mit TenantMixin +- `routes.py` — CRUD + tool execution: + - `GET /api/v1/mcp-client/servers` — List server configs + - `POST /api/v1/mcp-client/servers` — Create server config + - `PATCH /api/v1/mcp-client/servers/{id}` — Update server config + - `DELETE /api/v1/mcp-client/servers/{id}` — Delete server config + - `GET /servers/{id}/tools` — List tools from external server + - `POST /servers/{id}/execute` — Execute tool on external server +- `schemas.py` — Pydantic schemas (McpServerConfigCreate/Update/Response, McpServerToolsResponse, McpServerExecuteRequest/Response) +- `client.py` — Async MCP client using httpx (list_tools, execute_tool, health_check) +- `tool_registry_integration.py` — Integriert externe MCP-Tools in ai_assistant tool_registry + - `sync_external_tools()` — Fetches tools from all enabled servers and registers them + - `unregister_all_external_tools()` — Cleanup + - Tool naming: `mcp__{server}__{tool}` +- `migrations/0001_initial.sql` — mcp_server_configs table + +**Frontend:** +- `frontend/src/api/mcpClient.ts` — API client with React Query hooks (useMcpServers, useCreateMcpServer, useUpdateMcpServer, useDeleteMcpServer, useMcpServerTools) +- MCP Client settings UI in SettingsMcp.tsx (server CRUD, tool viewing) +- i18n entries for mcp.client.* + +**Tests:** `tests/test_mcp_client.py` — 8 tests (all passing) +- AC1: List servers (empty) +- AC2: Create server config +- AC3: Update server config +- AC4: Delete server config +- AC5: List servers after creating +- AC6: Unauthorized access rejected +- AC7: Execute on non-existent server returns 404 +- AC8: Tool registry integration verification + +### Verifikation +- Alle 15 Tests passing (7 + 8) +- TSC: 0 neue Errors (nur pre-existing Dms.tsx errors) +- 2 Commits mit klaren Messages +- TenantMixin für McpServerConfig verwendet +- RBAC (require_permission) auf allen API-Routes +- i18n (de.json, en.json) aktualisiert +- Keine .env committet +- Bestehende Patterns verwendet (apiClient, React Query hooks, PluginManifest) + +**Phase 5 Batch 4 Gesamt: ✅ Complete**