Dla nowej prezentacji wywołaj `create_presentation` raz. Nie listuj najpierw biblioteki. Nie wgrywaj zaślepki.

`kind` to `presentation` (slajdy) albo `dashboard` (jedna przewijana strona). HTML tego nie ustala. Zobacz [Slajdy i dashboardy](/pl/docs/html-conventions/).

Nigdy nie wkładaj zawartości obrazków ani fontów do argumentów narzędzi MCP.

## Klienty czatowe (Claude.ai, bez dysku)

Wyślij `files` z jednym samodzielnym `index.html`. CSS i JS trzymaj w tym HTML. Obrazki jako adresy https albo małe data URI. Nie buduj zipa w przeglądarce. `add_files` z `url` może ściągnąć zdalny asset.

```
create_presentation({ "title": "Q1 Review", "kind": "presentation", "files": [{ "path": "index.html", "content": "<!doctype html>..." }] })
```

Potem podaj użytkownikowi `viewUrl`. Jeśli `missingAssets` nie jest puste, dociągnij te URL-e przez `add_files` albo powiedz, że prezentacja jest niekompletna.

## Klienty lokalne (Cursor, Claude Code, pliki na dysku)

Wywołaj `create_presentation` tylko z tytułem i `kind`. Nie wklejaj `index.html` ani binariów do narzędzia.

```
create_presentation({ "title": "Q1 Review", "kind": "dashboard" })
```

Odczytaj `uploadUrl`. Najlepiej jeden zip całego folderu (serwer rozpakuje pojedynczy folder nadrzędny). Użyj zipa, gdy ścieżka ma spacje albo znaki spoza ASCII (`curl -T` nie koduje URL-a).

```bash
cd <dir> && zip -r /tmp/deck.zip . -x '.git/*' '.cursor/*' '.agents/*' 'node_modules/*' 'skills-lock.json' '*.zip' '*.code-workspace'
curl -sS -T /tmp/deck.zip -H 'Content-Type: application/zip' -w '\n%{http_code}\n' "<uploadUrl>"
```

Albo najpierw `index.html`, potem każdą pozostałą ścieżkę ASCII:

```bash
curl -sS -T index.html "<uploadUrl>index.html"
curl -sS -T "assets/hero.webp" "<uploadUrl>assets/hero.webp"
```

`curl -T` na `uploadUrl` (ze slashem na końcu) jest w porządku: serwer rozpakuje zip nawet gdy curl dopisze `deck.zip` do ścieżki.

Czytaj `missingAssets` z każdego JSON-a. Powtarzaj, aż lista będzie pusta. Gdy `uploadUrl` wygaśnie, wywołaj `create_upload_link` i kontynuuj. Na końcu `get_presentation_files` i podaj `viewUrl`.

> **Uwaga:** Nie mów użytkownikowi, że upload jest skończony, gdy `missingAssets` nie jest puste albo jest `warning`. Nie spłaszczaj zipa (`zip -j`). Zachowaj względne ścieżki.

## Nowa prezentacja vs rewizja

`create_presentation` tworzy nową prezentację. `add_revision` / zip na `create_upload_link` to nowa wersja tej samej prezentacji. Historia, linki i komentarze zostają.

Rewizja, gdy użytkownik wskazał prezentację, wkleił URL albo id Prezzly, albo powiedział update / kolejna rewizja. Nowa prezentacja, gdy prosi o osobną kopię. Gdy nie jesteś pewien, zapytaj.

### Edycja lokalna

1. Wywołaj `create_upload_link` z id prezentacji.
2. Spakuj to, co się zmieniło. Sama zmiana tekstu może być zipem `index.html`. Wcześniej wgrane pliki, do których HTML nadal się odwołuje, są ponownie użyte (`reusedAssets`).
3. `curl -T` zipa na `uploadUrl`.
4. Wywołaj `get_presentation_files`. Gdy `missingAssets` jest puste, podaj `viewUrl`.

Pojedynczy PUT `index.html` na istniejącą prezentację jest odrzucany (400). Zip na `uploadUrl` to nowa rewizja.

### Edycja w czacie

`add_revision` z `files` zawierającymi prawdziwy `index.html`. Pliki, do których HTML nadal się odwołuje, są ponownie użyte. Nigdy nie wysyłaj zaślepki, żeby dostać `uploadUrl`. Do tego służy `create_upload_link`.

`add_files` dopisuje mały tekst albo zdalny `https` URL. Istniejące ścieżki są odrzucane; żeby je zastąpić, zrób zip nowej rewizji.

`restore_revision` cofa zmianę. Rewizje to historia.

## Odpowiedzi uploadu

| Status | Sygnał w body | Co zrobić |
| --- | --- | --- |
| 200 | `missingAssets` niepuste | Wgraj wymienione ścieżki. Jeszcze nie koniec. |
| 200 | `missingAssets: []` | `get_presentation_files`, potem `viewUrl`. |
| 200 | jest `warning` | Zareaguj na warning zanim skończysz. |
| 401 | podpowiedź `create_upload_link` | Token wygasł. `create_upload_link`, retry. |
| 402 | `code: plan_limit` | Limit miejsca albo rozmiaru uploadu. Powiedz użytkownikowi; nie ponawiaj. |
| 409 | najpierw `index.html` albo zip | Pusta prezentacja. Najpierw HTML albo zip. |
| 409 | `files` + `missingAssets` | Ścieżka istnieje z innymi bajtami. Zastąp zipem / `add_revision`. |
| 400 | `index.html` nie da się tak dodać | Zastąp HTML zipem (lokalnie) albo `add_revision` files (czat). |

Ponowny `curl -T` tych samych bajtów jest bezpieczny: wraca 200, nie 409.

Dodaj `-w '\n%{http_code}\n'`, żeby widzieć status. `curl -sS` wypisuje JSON przy 4xx, więc czytaj body, nie tylko kod wyjścia.

## Nie rób tego

- Nie wgrywaj zaślepki, placeholdera ani pustej skorupy z obietnicą poprawki
- Nie wkładaj obrazka, fontu, zipa ani lokalnego `index.html` do argumentów na kliencie lokalnym
- Nie wołaj `list_presentations`, żeby zgadnąć prezentację, ani przed pierwszym uploadem
- Nie filtruj folderu po `html`/`css`/`js` i nie ignoruj obrazków
- Nie podawaj `viewUrl` bez `get_presentation_files` po ostatnim uploadzie

Jeśli w katalogu narzędzi nie ma `create_upload_link`, przeładuj serwer MCP Prezzly. Zobacz [Rozwiązywanie problemów](/pl/docs/troubleshooting/).