# Strona, którą obsługuje agent

Notatka, 2026-10-20

Stawiam, że za kilka lat mało kto będzie wchodził na strony. Wyśle asystenta. Zrobiłem więc stronę, na której asystent umówi ze mną rozmowę bez logowania i bez klucza API. Zajęło mi to kilka wieczorów z Claude Code i Codexem.

Ostatnia zmiana: 2026-10-22

## Po co cztery wejścia do jednej rezerwacji

Każde narzędzie z asystentem AI umie co innego, więc ta sama rezerwacja ma cztery wejścia:

- API (`GET /api/v1/slots` i `POST /api/v1/bookings`) jest dla agentów, które potrafią wysyłać zapytania, np. Claude Code, Codex albo tryb agenta w ChatGPT.
- Zwykły czat ChatGPT i Claude umie tylko czytać strony. Każdy wolny termin ma więc gotowy `booking_link`, do którego asystent dopisuje dane osoby, a człowiek klika jeden przycisk.
- Formularz działa bez JavaScriptu, więc agent sterujący przeglądarką też go wypełni.
- Serwer MCP pod adresem `https://majlo.dev/mcp` jest dla klientów AI, które da się z nim połączyć.

## Co nie wyszło

Najbardziej zaskoczyło mnie to, że zwykły czat ChatGPT w ogóle nie widział strony, dopóki nie była zaindeksowana. Nie znajdował jej albo nie chciał jej otworzyć. Otwiera sam tylko adresy, które zna z wyszukiwarki, więc lista wolnych terminów jest dostępna dla wyszukiwarek. Nie ma to gwarancji dla każdego narzędzia ChatGPT.

Z tego samego powodu zwykły czat nie wyśle POST i nie otworzy adresu, który sam złożył z danymi osoby. Przy takim linku ChatGPT pokazuje ostrzeżenie „Check this link is safe”, więc ostatnie kliknięcie robi człowiek.

## Jak się bronię przed spamem

Bez logowania każdy mógłby wpisać cudzy adres albo zająć wszystkie terminy. Dlatego:

- Rezerwacja czeka 30 minut na kliknięcie w mailu i do kalendarza trafia dopiero po nim. Link otwiera stronę z przyciskiem, więc skaner linków w skrzynce niczego nie potwierdzi.
- Jeden adres może mieć jedną aktywną rezerwację, żeby jedna osoba nie zajęła wszystkich terminów.
- Odrzucam około 97 tys. domen jednorazowych i adresy bez rekordu MX, bo potwierdzenie ma dojść do prawdziwej skrzynki.
- Temat od klienta trafia do kalendarza z etykietą „niezweryfikowane” i limitem 500 znaków. Ten kalendarz czyta mój ChatGPT, a obcy tekst mógłby zawierać polecenia dla niego.

## Dla agentów

Instrukcja jest na [majlo.dev/agents](https://majlo.dev/agents), a skrót w [llms.txt](https://majlo.dev/llms.txt). Każda strona ma też wersję w markdownie, wystarczy wysłać nagłówek `Accept: text/markdown`.

## Słowniczek

- **API**: Interfejs, przez który jeden program prosi inny o dane albo o wykonanie czynności.
- **Claude Code**: Program firmy Anthropic, w którym asystent Claude pracuje na plikach i kodzie na twoim komputerze.
- **Codex**: Asystent AI firmy OpenAI, który pracuje na plikach na twoim komputerze: czyta je, zmienia i uruchamia programy.
- **agent**: Program oparty na modelu AI, który sam wykonuje zadania, np. szuka informacji, klika i zapisuje.
- **JavaScript**: Język programowania, dzięki któremu strona w przeglądarce reaguje na kliknięcia i zmienia się bez przeładowania.
- **MCP**: Standard, dzięki któremu asystent AI może łączyć się z aplikacjami, np. z kalendarzem czy listą zadań.
- **indeksowanie**: Dopisanie strony do spisu wyszukiwarki, dzięki czemu można ją znaleźć.
- **GET i POST**: Dwa rodzaje próśb do serwera: GET pobiera dane, POST wysyła je do zapisania.
- **skaner linków**: Program, który sam otwiera linki z maili, żeby sprawdzić, czy nie prowadzą do czegoś groźnego.
- **domeny jednorazowe**: Serwisy dające skrzynkę e-mail na chwilę, bez rejestracji, często po to, żeby nie podawać prawdziwego adresu.
- **rekord MX**: Wpis w ustawieniach domeny, który mówi, dokąd dostarczać pocztę. Bez niego na ten adres nic nie dojdzie.
- **markdown**: Prosty zapis tekstu z kilkoma znaczkami, np. # dla nagłówka, czytelny dla ludzi i programów.
- **nagłówek**: Dopisek na początku zapytania do serwera, który mówi, jak odpowiedzieć, np. w jakim formacie.
