Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| ai:mcp:servery:higgsfield-mcp-nebo-api [04.05.2026 08:51] – vytvořeno Petr Nosek | ai:mcp:servery:higgsfield-mcp-nebo-api [04.05.2026 08:54] (aktuální) – odstraněno Petr Nosek | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| - | ====== Higgsfield MCP v Claude Code a OpenCode ====== | ||
| - | |||
| - | // | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | Tento zápisek popisuje konkrétní nasazení v Claude Code a OpenCode běžících v Dockeru. Důležité je hlavně zachytit rozdíl: v Claude Code OAuth proběhl rychle, zatímco v OpenCode se objevily chyby kolem OAuth scope. Nakonec fungovaly dvě cesty: device flow s tokenem platným jen 24 hodin a praktičtější převzetí delšího tokenu z Claude Code. Vedle oficiálního remote MCP existují i neoficiální lokální MCP servery nad API key/API secret; ty jsou popsané níže jako jiná architektonická cesta. | ||
| - | |||
| - | ===== Výchozí stav ===== | ||
| - | |||
| - | Cíl byl připojit Higgsfield MCP do dvou klientů: | ||
| - | |||
| - | * Claude Code | ||
| - | * OpenCode | ||
| - | |||
| - | Higgsfield na své MCP stránce uvádí, že není potřeba spravovat API klíče. API key a API secret z Higgsfield API proto nejsou totéž jako autentizace pro oficiální MCP endpoint. Pro MCP se používá OAuth přihlášení přes Higgsfield účet. | ||
| - | |||
| - | ===== Claude Code ===== | ||
| - | |||
| - | V Claude Code stačí nakonfigurovat vzdálený HTTP MCP server: | ||
| - | |||
| - | <code bash> | ||
| - | claude mcp add --transport http higgsfield https:// | ||
| - | </ | ||
| - | |||
| - | Ekvivalentní ruční konfigurace v '' | ||
| - | |||
| - | <code json> | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Po restartu Claude Code se autentizace spustí přes ''/ | ||
| - | |||
| - | ==== Docker a callback port 65498 ==== | ||
| - | |||
| - | Claude Code v mém prostředí běží v Dockeru. Při OAuth flow Claude Code vytvořil callback adresu: | ||
| - | |||
| - | < | ||
| - | http:// | ||
| - | </ | ||
| - | |||
| - | Proto bylo nutné zajistit, aby se prohlížeč na hostitelském systému dostal na port '' | ||
| - | |||
| - | Typicky to znamená publikovat port při spuštění kontejneru: | ||
| - | |||
| - | <code bash> | ||
| - | docker run -p 127.0.0.1: | ||
| - | </ | ||
| - | |||
| - | Nebo v '' | ||
| - | |||
| - | <code yaml> | ||
| - | ports: | ||
| - | - " | ||
| - | </ | ||
| - | |||
| - | Pokud se port doplní až dodatečně, | ||
| - | |||
| - | ===== OpenCode: první pokus přes OAuth ===== | ||
| - | |||
| - | Do ''/ | ||
| - | |||
| - | <code json> | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | OpenCode pak spustil OAuth flow, ale v prohlížeči se objevila chyba: | ||
| - | |||
| - | < | ||
| - | The requested scope is invalid, unknown, or malformed. The OAuth 2.0 Client is not allowed to request scope ' | ||
| - | </ | ||
| - | |||
| - | Otevřená autorizační URL mířila na Clerk: | ||
| - | |||
| - | < | ||
| - | https:// | ||
| - | </ | ||
| - | |||
| - | Problém byl v tom, že OpenCode posílal scope '' | ||
| - | |||
| - | ===== Proč Claude Code fungoval a OpenCode ne ===== | ||
| - | |||
| - | Claude Code použil předregistrovaného OAuth klienta pro Higgsfield. V uložených credentials bylo vidět, že Claude Code měl pro Higgsfield uložené: | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * scope včetně '' | ||
| - | |||
| - | OpenCode naproti tomu použil vlastní OAuth flow s jiným callbackem, například: | ||
| - | |||
| - | < | ||
| - | http:// | ||
| - | </ | ||
| - | |||
| - | Když jsem se pokusil použít stejný '' | ||
| - | |||
| - | < | ||
| - | {" | ||
| - | </ | ||
| - | |||
| - | To dává smysl: předregistrovaný klient Claude Code má povolený callback pro Claude Code, ne callback OpenCode. Přepsání '' | ||
| - | |||
| - | ===== Co nezabralo ===== | ||
| - | |||
| - | Zkoušel jsem: | ||
| - | |||
| - | * nechat OpenCode udělat OAuth automaticky přes '' | ||
| - | * přidat do OpenCode stejný '' | ||
| - | * zkusit nastavit scope bez '' | ||
| - | |||
| - | Ani poslední úprava nezabrala. V mém setupu zůstal problém v OAuth toku OpenCode: buď se požadoval nepovolený scope '' | ||
| - | |||
| - | ===== Alternativní cesta: lokální MCP servery nad API key/API secret ===== | ||
| - | |||
| - | Vedle oficiálního remote endpointu existují také neoficiální lokální MCP servery, které neřeší OAuth proti '' | ||
| - | |||
| - | V diskusi jsem porovnával hlavně dva repozitáře od stejného autora: | ||
| - | |||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | |||
| - | Oba projekty používají lokální Python server a credentials z Higgsfield API. Prakticky to znamená, že OpenCode by nepřipojoval '' | ||
| - | |||
| - | ==== Rozdíl mezi oběma repozitáři ==== | ||
| - | |||
| - | ^ Oblast ^ '' | ||
| - | | Zaměření | Jednodušší MCP server pro základní image/video workflow. | Širší MCP server s více parametry a více typy nástrojů. | | ||
| - | | Framework | FastMCP. | Oficiální low-level '' | ||
| - | | Credentials | '' | ||
| - | | Instalace podle README | Clone repozitáře a instalace závislostí přes '' | ||
| - | | Nástroje | Jednodušší názvy jako '' | ||
| - | | Parametry | Méně voleb, rychlejší na pochopení. | Více voleb: rozměry, batch size, seed, reference image, webhooky, motion strength, start/end frame. | | ||
| - | | Video | Image-to-video přes DoP/motion preset. | Image-to-video přes DoP, motions array, end frame. | | ||
| - | | Speech/ | ||
| - | | Character management | Vytvoření a listování character references. | Vytvoření, | ||
| - | | Resources/ | ||
| - | |||
| - | ==== Kdy dává smysl který projekt ==== | ||
| - | |||
| - | '' | ||
| - | |||
| - | '' | ||
| - | |||
| - | ==== Důležitý konflikt názvů ==== | ||
| - | |||
| - | Oba repozitáře používají stejný Python import namespace i stejný command/ | ||
| - | |||
| - | < | ||
| - | higgsfield_mcp | ||
| - | higgsfield-mcp | ||
| - | </ | ||
| - | |||
| - | Proto je nedává smysl instalovat vedle sebe do stejného Python prostředí. Pokud by se testovaly oba, je lepší použít oddělené virtualenv/ | ||
| - | |||
| - | ==== Princip konfigurace v OpenCode ==== | ||
| - | |||
| - | Pro lokální MCP server by konfigurace v OpenCode nebyla remote OAuth konfigurace, | ||
| - | |||
| - | <code json> | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | }, | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | U projektu '' | ||
| - | |||
| - | <code json> | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ==== Výhody a nevýhody lokálních wrapperů ==== | ||
| - | |||
| - | Výhody: | ||
| - | |||
| - | * obejdou problematické OAuth flow v OpenCode | ||
| - | * používají běžné API key/API secret, které se dají uložit přes '' | ||
| - | * běží lokálně a dají se případně upravit | ||
| - | |||
| - | Nevýhody: | ||
| - | |||
| - | * nejsou to oficiální Higgsfield MCP endpointy | ||
| - | * mohou pokrývat jen část funkcí oficiálního MCP konektoru | ||
| - | * je potřeba řešit instalaci Python prostředí a závislostí | ||
| - | * oba porovnávané projekty kolidují názvem balíčku/ | ||
| - | * bezpečnost API key/API secret je na lokální konfiguraci | ||
| - | |||
| - | ===== Alternativní funkční cesta: device flow pro OpenCode ===== | ||
| - | |||
| - | Později jsem našel pokyn pro OpenClaw, že Higgsfield MCP podporuje OAuth device flow. To je pro OpenCode zajímavé, protože device flow nepotřebuje lokální '' | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | Pro device flow je důležitý server '' | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | ==== Ruční spuštění device flow ==== | ||
| - | |||
| - | Získání device kódu: | ||
| - | |||
| - | <code bash> | ||
| - | curl -s https:// | ||
| - | -X POST \ | ||
| - | -H ' | ||
| - | -d ' | ||
| - | </ | ||
| - | |||
| - | Odpověď má tvar: | ||
| - | |||
| - | <code json> | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Uživatel otevře '' | ||
| - | |||
| - | <code bash> | ||
| - | curl -s https:// | ||
| - | -X POST \ | ||
| - | -H ' | ||
| - | -d ' | ||
| - | </ | ||
| - | |||
| - | Po úspěšném potvrzení se vrátí Bearer token: | ||
| - | |||
| - | <code json> | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Tento token je možné uložit do stejného souboru, který používá OpenCode: | ||
| - | |||
| - | <code bash> | ||
| - | install -m 600 /dev/null / | ||
| - | # do souboru zapsat pouze access_token, | ||
| - | </ | ||
| - | |||
| - | OpenCode konfigurace zůstává stejná jako u Bearer workaroundu: | ||
| - | |||
| - | <code json> | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | }, | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ==== Nevýhoda device flow ==== | ||
| - | |||
| - | Device flow se podařilo dokončit a token fungoval, ale v odpovědi byl parametr: | ||
| - | |||
| - | < | ||
| - | " | ||
| - | </ | ||
| - | |||
| - | To znamená platnost jen 24 hodin. Navíc device flow nevrací refresh token, takže tiché obnovení není možné – každý den by bylo nutné opakovat celý flow s prohlížečem. Proto jsem se po testu vrátil k tokenu převzatému z Claude Code credentials, | ||
| - | |||
| - | ===== Preferovaný workaround: token z Claude Code pro OpenCode ===== | ||
| - | |||
| - | Protože Claude Code už měl vůči Higgsfield úspěšně získaný OAuth token, nejrychlejší funkční řešení bylo: | ||
| - | |||
| - | - vytáhnout Higgsfield access token a refresh token z Claude Code credentials | ||
| - | - uložit je do souborů pro OpenCode | ||
| - | - v OpenCode vypnout OAuth flow a posílat access token jako statický Bearer header | ||
| - | |||
| - | **Access token** má vždy platnost **24 hodin** – pevně dané na straně Higgsfield serveru, nedá se změnit. Claude Code při OAuth flow ukládá vedle access tokenu i **refresh token**: ten je dlouhodobý a slouží k tichému získání nového access tokenu bez opakovaného přihlašování v prohlížeči. Oba tokeny je při první extrakci potřeba uložit. Jak využít refresh token k automatickému obnovování, | ||
| - | |||
| - | Token se nachází v souboru: | ||
| - | |||
| - | < | ||
| - | ~/ | ||
| - | </ | ||
| - | |||
| - | V sekci '' | ||
| - | |||
| - | <code python> | ||
| - | import json | ||
| - | from pathlib import Path | ||
| - | |||
| - | credentials_path = Path.home() / " | ||
| - | target_path = Path.home() / " | ||
| - | refresh_path = Path.home() / " | ||
| - | |||
| - | with credentials_path.open() as f: | ||
| - | data = json.load(f) | ||
| - | |||
| - | for item in data.get(" | ||
| - | if item.get(" | ||
| - | access_token = item[" | ||
| - | refresh_token = item.get(" | ||
| - | break | ||
| - | else: | ||
| - | raise SystemExit(" | ||
| - | |||
| - | target_path.write_text(access_token.strip()) | ||
| - | target_path.chmod(0o600) | ||
| - | print(f" | ||
| - | |||
| - | if refresh_token: | ||
| - | refresh_path.write_text(refresh_token.strip()) | ||
| - | refresh_path.chmod(0o600) | ||
| - | print(f" | ||
| - | else: | ||
| - | print(" | ||
| - | </ | ||
| - | |||
| - | OpenCode konfigurace pak vypadá takto: | ||
| - | |||
| - | <code json> | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | }, | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Soubory '' | ||
| - | |||
| - | Tím se OAuth flow v OpenCode úplně obejde a OpenCode použije již existující token získaný přes Claude Code. | ||
| - | |||
| - | ===== Automatická obnova tokenu přes refresh token ===== | ||
| - | |||
| - | Higgsfield vydává access tokeny vždy s platností **24 hodin**. Při prvním OAuth flow Claude Code ale uloží do credentials dva tokeny: | ||
| - | |||
| - | * **access_token** – krátkodobý Bearer token pro API volání, vyprší za 24 hodin | ||
| - | * **refresh_token** – dlouhodobý token pro tiché obnovení; nepotřebuje prohlížeč ani přihlašování | ||
| - | |||
| - | Refresh flow funguje tak, že skript zavolá Higgsfield OAuth token endpoint s refresh tokenem. Server vydá nový access token a obvykle i rotovaný refresh token (starý se nahradí novým). | ||
| - | |||
| - | ==== Refresh skript ==== | ||
| - | |||
| - | Uložit jako '' | ||
| - | |||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | # Refreshes Higgsfield OAuth access token using stored refresh token. | ||
| - | # Higgsfield issues tokens with 24h validity; run this every ~20h via cron. | ||
| - | |||
| - | set -euo pipefail | ||
| - | |||
| - | REFRESH_TOKEN_FILE=" | ||
| - | ACCESS_TOKEN_FILE=" | ||
| - | CLIENT_ID=" | ||
| - | TOKEN_ENDPOINT=" | ||
| - | |||
| - | REFRESH_TOKEN=$(cat " | ||
| - | |||
| - | RESPONSE=$(curl -s -X POST " | ||
| - | -H " | ||
| - | -d " | ||
| - | |||
| - | ACCESS_TOKEN=$(echo " | ||
| - | NEW_REFRESH_TOKEN=$(echo " | ||
| - | |||
| - | if [ -z " | ||
| - | echo " | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | echo -n " | ||
| - | |||
| - | if [ -n " | ||
| - | echo -n " | ||
| - | fi | ||
| - | |||
| - | echo " | ||
| - | </ | ||
| - | |||
| - | <code bash> | ||
| - | chmod +x ~/ | ||
| - | </ | ||
| - | |||
| - | Ruční spuštění (test nebo při vypršení tokenu): | ||
| - | |||
| - | <code bash> | ||
| - | ~/ | ||
| - | </ | ||
| - | |||
| - | ==== Nastavení cronu na Alpine / busybox ==== | ||
| - | |||
| - | Na Alpine s busyboxem standardní příkaz '' | ||
| - | |||
| - | <code bash> | ||
| - | sudo bash -c 'echo "0 */20 * * * / | ||
| - | sudo chown < | ||
| - | sudo chmod 600 / | ||
| - | </ | ||
| - | |||
| - | Interval '' | ||
| - | |||
| - | Spuštění crond, pokud ještě neběží: | ||
| - | |||
| - | <code bash> | ||
| - | sudo crond -b -l 8 | ||
| - | </ | ||
| - | |||
| - | ==== Automatický start crond po restartu (Alpine / OpenRC) ==== | ||
| - | |||
| - | Pokud má crond startovat automaticky při restartu kontejneru nebo systému, přidá se startup skript do ''/ | ||
| - | |||
| - | <code bash> | ||
| - | sudo bash -c 'cat > / | ||
| - | #!/bin/sh | ||
| - | crond -b -l 8 | ||
| - | EOF | ||
| - | chmod +x / | ||
| - | </ | ||
| - | |||
| - | Při dalším startu systému se crond spustí automaticky. | ||
| - | |||
| - | ===== Ověření ===== | ||
| - | |||
| - | Po úpravě konfigurace je potřeba restartovat OpenCode nebo otevřít novou session, aby se konfigurace znovu načetla. | ||
| - | |||
| - | Základní kontrola: | ||
| - | |||
| - | <code bash> | ||
| - | opencode mcp list | ||
| - | </ | ||
| - | |||
| - | Pokud se později začne vracet '' | ||
| - | |||
| - | * spustit refresh skript '' | ||
| - | * znovu provést přihlášení v Claude Code přes ''/ | ||
| - | * použít device flow, ale počítat s platností tokenu jen 24 hodin a bez možnosti tichého refreshe | ||
| - | |||
| - | ===== Rychlý troubleshooting pro budoucí řešení ===== | ||
| - | |||
| - | ==== Chyba: scope openid není povolený ==== | ||
| - | |||
| - | Příznak: | ||
| - | |||
| - | < | ||
| - | The OAuth 2.0 Client is not allowed to request scope ' | ||
| - | </ | ||
| - | |||
| - | Význam: OpenCode vytvořil nebo použil OAuth klienta, který nemá povolený scope '' | ||
| - | |||
| - | Rychlé řešení: Nepokračovat laděním API key/API secret. U oficiálního Higgsfield MCP jde o OAuth. Pokud OpenCode OAuth stále selhává, použít token z Claude Code jako Bearer header. Alternativně lze použít device flow, ale získaný token má jen 24hodinovou platnost a bez refresh tokenu. | ||
| - | |||
| - | ==== Chyba: redirect_uri nesedí ==== | ||
| - | |||
| - | Příznak: | ||
| - | |||
| - | < | ||
| - | The ' | ||
| - | </ | ||
| - | |||
| - | Význam: Použitý OAuth klient má předregistrovaný jiný callback než ten, který posílá OpenCode. V mém případě Claude Code používal '' | ||
| - | |||
| - | Rychlé řešení: Nepoužívat Claude Code '' | ||
| - | |||
| - | ==== Claude Code auth link se otevře, ale callback neprojde ==== | ||
| - | |||
| - | Příznak: autentizace v prohlížeči proběhne, ale Claude Code v kontejneru token nedostane. | ||
| - | |||
| - | Význam: Port callbacku není dostupný z hostitelského prohlížeče do Docker kontejneru. | ||
| - | |||
| - | Rychlé řešení: publikovat port '' | ||
| - | |||
| - | ===== Poznámky k bezpečnosti ===== | ||
| - | |||
| - | * Token nikdy neukládat přímo do '' | ||
| - | * Soubory '' | ||
| - | * Token v článku, logu ani chatu nevypisovat. | ||
| - | * Device flow token má podle testu platnost 24 hodin a neobsahuje refresh token. | ||
| - | * Refresh token může být zneplatněn ze strany Higgsfield (změna hesla, odvolání přístupu) – v takovém případě je nutné provést nový OAuth flow v Claude Code. | ||
| - | * U lokálních wrapperů nad Higgsfield API neukládat API key/API secret přímo do konfigurace; | ||
| - | |||
| - | ===== Shrnutí ===== | ||
| - | |||
| - | Claude Code fungoval, protože použil předregistrovaný OAuth flow a callback '' | ||
| - | |||
| - | ===== Zdroje ===== | ||
| - | |||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[https:// | ||
| - | * [[ai: | ||