# scalable-sync Synchronisiert Scalable Capital Broker-Transaktionen nach Wealthfolio via MCP. ## Voraussetzungen - Docker + Docker Compose - Wealthfolio mit MCP aktiviert (`WF_MCP_ENABLED=true`) - Scalable Capital: Agentic Investing aktiviert (Profil → Sicherheit) - `sc`-CLI auf dem Host installiert (siehe unten) ## Dateien | Datei | Zweck | |---|---| | `Dockerfile` | Container-Image | | `compose.yaml` | Docker Compose Config | | `example.env` | Vorlage für `.env` | | `scalable_sync.py` | Sync-Adapter | | `requirements.txt` | Python-Abhängigkeiten | ## Setup ### 1. Scalable CLI auf dem Host installieren **Linux / WSL:** ```bash curl -fsSL -o /tmp/sc.tar.gz \ "[https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-linux-x86_64-gnu.tar.gz](https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-linux-x86_64-gnu.tar.gz)" curl -fsSL -o /tmp/SHA256SUMS \ "[https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-SHA256SUMS](https://github.com/ScalableCapital/scalable-cli/releases/download/v1.0.0/sc-v1.0.0-SHA256SUMS)" cd /tmp && grep "linux-x86_64-gnu.tar.gz" SHA256SUMS | awk '{print $1 " sc.tar.gz"}' | sha256sum -c - tar -xzf sc.tar.gz sudo mv sc-v1.0.0-linux-x86_64-gnu/sc /usr/local/bin/sc sudo chmod +x /usr/local/bin/sc sc --version ``` ### 2. Login auf dem Host (einmalig) WSL/Linux hat keinen Keyring — daher `session_backend = "file"` setzen: ```bash mkdir -p ~/.config/scalable-cli cat > ~/.config/scalable-cli/config.toml <<'EOF' [auth] session_backend = "file" signing_key_backend = "file" EOF sc login --local-read-only ``` ### 3. .env anlegen ```bash cp example.env .env # WF_MCP_URL, WF_MCP_TOKEN, WF_ACCOUNT_ID, ASSET_MAP, PUID, PGID anpassen ``` ### 4. Bind-Mount in compose.yaml anpassen ```yaml volumes: - scalable-sync-data:/app/data - /home//.config/scalable-cli:/tmp/sc-config:ro ``` ### 5. Testen und starten ```bash docker compose build # Session testen docker compose run --rm scalable-sync sc whoami docker compose run --rm scalable-sync sc broker holdings # Dry-Run docker compose run --rm scalable-sync python /app/scalable_sync.py --once --dry-run # Start docker compose up -d ``` ## .env Referenz ```bash WF_MCP_URL=http://wealthfolio:8088/mcp WF_MCP_TOKEN=wf_mcp_dein_token_hier WF_ACCOUNT_ID=dein-konto-uuid SYNC_INTERVAL_HOURS=6 SC_OVERLAP_DAYS=14 SC_SETTLED_ONLY=true # ISIN → Wealthfolio-Symbol ASSET_MAP={"IE00B4L5Y983":"EUNL.DE","IE00B3RBWM25":"VWCE.DE"} PUID=1000 PGID=1000 ``` ### WF_ACCOUNT_ID finden Wealthfolio → Accounts → Konto anklicken → ID aus der URL kopieren. ### ASSET_MAP JSON-Objekt `"ISIN": "Symbol"`. ISINs ermitteln mit: ```bash sc broker holdings ``` ### SC_PORTFOLIO_ID Nur bei mehreren Scalable-Portfolios. Ermitteln mit: ```bash docker compose run --rm scalable-sync sc broker context show ``` ## Session erneuern ```bash sc login --local-read-only docker compose restart scalable-sync ``` ## Befehle | Befehl | Beschreibung | |---|---| | `docker compose run --rm scalable-sync python /app/scalable_sync.py --once --dry-run` | Testlauf ohne Schreiben | | `docker compose run --rm scalable-sync python /app/scalable_sync.py --once` | Einmaliger Sync | | `docker compose logs -f` | Logs anzeigen | | `docker compose down && docker compose up -d` | Neustart | ## Volumes | Volume | Inhalt | Zweck | |---|---|---| | `scalable-sync-data` | state.db, audit.jsonl, dead-letter.jsonl | Sync-Status und Logs | Die Session liegt auf dem Host unter `~/.config/scalable-cli/` und wird als read-only Bind-Mount eingehängt. ## Troubleshooting | Problem | Lösung | |---|---| | `sc whoami` schlägt fehl | Session abgelaufen — `sc login --local-read-only` wiederholen, dann `docker compose restart` | | Keine Transaktionen | `SC_SETTLED_ONLY` und `SC_OVERLAP_DAYS` prüfen | | Unmapped ISIN | ISIN in `ASSET_MAP` ergänzen | | Mehrere Portfolios | `SC_PORTFOLIO_ID` in `.env` setzen | | Doppelte Activities | `WF_ACCOUNT_ID` prüfen | ## Wealthfolio-Vorbereitung ### 1. MCP aktivieren In der Wealthfolio `compose.yaml`: ```yaml environment: WF_MCP_ENABLED: "true" WF_MCP_TOKEN: "wf_mcp_dein_geheimer_token" ``` Danach Wealthfolio neu starten. ### 2. Account anlegen Wealthfolio → **Accounts** → **Add Account**: | Feld | Wert | |---|---| | Name | `Scalable Capital` (frei wählbar) | | Type | `Brokerage` | | Currency | `EUR` | **WF_ACCOUNT_ID ermitteln:** Account anklicken → ID aus der URL kopieren: ```` /accounts/550e8400-e29b-41d4-a716-446655440000/ → diese UUID ist deine WF_ACCOUNT_ID ```` ### 3. Assets anlegen Jedes ETF muss in Wealthfolio als Asset existieren. Wealthfolio → **Assets** → Asset suchen oder neu anlegen. ISINs deiner gehaltenen ETFs ermitteln: ```bash sc broker holdings ``` Das **Symbol** in Wealthfolio (z. B. `EUNL.DE`) exakt in `ASSET_MAP` übernehmen: ```bash ASSET_MAP={"IE00B4L5Y983":"EUNL.DE","IE00B3RBWM25":"VWCE.DE","DE0002635307":"EXSA.DE"} ``` > **Wichtig:** Symbol muss exakt übereinstimmen — am besten aus Wealthfolio kopieren, nicht raten.