Skille, hooki, serwery MCP i subagenty w Claude Code: co wybrać i kiedy
Kiedy w Claude Code sięgnąć po CLAUDE.md, skill, hook, serwer MCP albo subagenta: oficjalna dokumentacja i prawdziwy zestaw, na którym powstała ta strona.
CLAUDE.md trzyma to, co Claude ma wiedzieć w każdej sesji, skill to procedura potrzebna tylko czasem, a hook to coś, co musi się wydarzyć za każdym razem. Serwer MCP sięga po dane spoza repozytorium, a subagent bierze poboczną robotę, która zalałaby Ci kontekst. Niżej: każdy element według oficjalnej dokumentacji, a potem zestaw, na którym powstała ta strona.
TL;DR
- Prośba czy przymus: CLAUDE.md i skille to instrukcje, które Claude interpretuje; hook odpala się na swoim zdarzeniu zawsze.
- Koszt w kontekście: za CLAUDE.md płacisz przy każdym zapytaniu, skille i narzędzia MCP kosztują niewiele, dopóki ich nie użyjesz, a subagent pracuje we własnym oknie i oddaje podsumowanie.
- Dokładaj elementy, gdy pojawi się sygnał: powtarzana poprawka, wklejany playbook, kopiowana karta przeglądarki, zalany kontekst, zasada, która musi działać zawsze.
Czym jest każdy z pięciu elementów?
- 01 CLAUDE.md Wczytywany w każdej sesji: komendy, konwencje, stałe zasady.
- 02 Skille Playbook, który wczytuje się, gdy pasuje do zadania albo gdy wpiszesz /nazwa.
- 03 Hooki Twój skrypt, który Claude Code uruchamia przy zdarzeniu, za każdym razem.
- 04 Serwery MCP Narzędzia i dane spoza repozytorium, przez otwarty standard.
- 05 Subagenty Poboczna robota we własnym kontekście. Wraca tylko podsumowanie.
Z dokumentacji warto wyciągnąć kilka szczegółów. Dokumentacja pamięci radzi trzymać każdy CLAUDE.md poniżej 200 linii. Własne komendy slash zostały scalone ze skillami. Hook może uruchomić komendę powłoki, zapytanie HTTP, narzędzie MCP, prompt albo subagenta.
Są jeszcze pluginy, które pakują to wszystko w jedną instalowalną całość do wielu repozytoriów. To repozytorium żadnego nie ma, więc je pomijam.
Jakie dwa pytania rozstrzygają prawie wszystko?
Kto decyduje, że coś się uruchomi? Dokumentacja mówi wprost: hook zawsze odpala się na swoim zdarzeniu, a skill to instrukcje, które Claude interpretuje, więc wynik może się różnić. CLAUDE.md należy do tej drugiej grupy: według dokumentacji pamięci Claude traktuje go jako kontekst, a nie wymuszoną konfigurację. „Nigdy nie edytuj .env” w CLAUDE.md to więc prośba, a hook PreToolUse, który blokuje edycję, to egzekwowanie.
Ile to kosztuje w kontekście? Według tabeli kosztów z dokumentacji:
| Element | Kiedy się wczytuje | Koszt w kontekście |
|---|---|---|
| CLAUDE.md | start sesji, cała treść | przy każdym zapytaniu |
| Skill | opisy na starcie, treść przy użyciu | niski, dopóki nie jest użyty |
| Serwer MCP | nazwy narzędzi na starcie, schematy na żądanie | niski, dopóki narzędzie nie jest użyte |
| Subagent | przy uruchomieniu, we własnym oknie | odizolowany od głównej sesji |
| Hook | przy zdarzeniu, poza modelem | zero, chyba że zwraca kontekst |
Dlatego długi CLAUDE.md to złe miejsce na dokumentację referencyjną: płacisz za nią przy każdym zapytaniu, potrzebna czy nie.
Który element do jakiej potrzeby?
| Potrzebujesz | Wybierz | Dlaczego |
|---|---|---|
| Żeby Claude zawsze znał komendy i konwencje | CLAUDE.md | wczytywany zawsze |
| Procedury ze skutkami ubocznymi, którą odpalasz sam | skill z disable-model-invocation: true |
uruchamiasz go tylko Ty, a jego opis nie zajmuje kontekstu |
| Wiedzy w tle, z której Claude skorzysta w razie potrzeby | skill, user-invocable: false, jeśli to nie komenda |
wczytywany na żądanie |
| Czegoś przy każdej edycji, prompcie albo końcu odpowiedzi | hook | deterministyczny |
| Zablokowania groźnej akcji | hook PreToolUse albo reguły uprawnień |
egzekwowanie, a nie prośba |
| Danych z systemu, którego Claude nie widzi | serwer MCP | połączenie i autoryzacja po stronie serwera |
| Researchu po wielu plikach albo pracy równoległej | subagent | wraca tylko podsumowanie |
| Częstej wymiany zdań nad jednym problemem | główna rozmowa | tu dokumentacja odradza subagenty |
Dokumentacja radzi też dokładać elementy dopiero wtedy, gdy pojawi się konkretny sygnał:
- Claude drugi raz myli konwencję: wpis do CLAUDE.md.
- Trzeci raz wklejasz ten sam playbook: skill.
- Ciągle kopiujesz dane z karty przeglądarki: serwer MCP.
- Poboczne zadanie zalewa rozmowę: subagent.
- Coś ma się dziać zawsze, bez proszenia: hook.
Jak wygląda mój zestaw?
Ta strona powstała w Claude Code z wiki projektu w .claude/project-info/. Oto każdy element w tym repozytorium.
CLAUDE.md: rozdzielnik, a nie encyklopedia
Mój CLAUDE.md ma 76 linii. Większość to tabela routingu, która łączy słowa z moich poleceń („locales, translation, hreflang”) ze stronami wiki. Reszta to niezmienniki (budżety wydajności, licencje, „żadnych zmyślonych faktów”) i komendy.
Ścieżki są celowo zwykłym tekstem. @import wczytałby każdą stronę do każdej sesji, a dokumentacja potwierdza, że importy nie zmniejszają kosztu kontekstu. Samo wiki opisuję w osobnym wpisie: LLM wiki, czyli pamięć projektu dla Claude Code.
Trzy hooki
{
"hooks": {
"SessionStart": [{ "hooks": [{ "type": "command",
"command": "node .claude/hooks/session-start.mjs", "timeout": 10 }] }],
"UserPromptSubmit": [{ "hooks": [{ "type": "command",
"command": "node .claude/hooks/wiki-context.mjs", "timeout": 10 }] }],
"Stop": [{ "hooks": [{ "type": "command",
"command": "node .claude/hooks/wiki-check.mjs --stop-hook", "timeout": 30 }] }]
}
}
To wersja skrócona: w prawdziwym .claude/settings.json każda ścieżka zaczyna się od ${CLAUDE_PROJECT_DIR:-.}, a komendy idą przez bash.
- SessionStart wypisuje „kartę sesji”: odnośnik do zasad współpracy, stan gita (same liczby) i reguły z
lessons.md. Odpala się na starcie, przy wznowieniu, po/cleari po kompaktowaniu. Po każdym kompaktowaniu reguły wracają więc słowo w słowo, cokolwiek zgubiło streszczenie. - UserPromptSubmit ocenia każdy prompt względem tabeli routingu i wskazuje do pięciu stron do przeczytania. Prompty krótsze niż 25 znaków niczego nie dostają.
- Stop sprawdza, czy w tej sesji zmienił się kod bez zmiany w wiki. Jeśli tak, zwraca
decision: "block"z powodem, raz na dany stan, więc Claude aktualizuje stronę, zanim skończy. Gdystop_hook_activema wartość true, hook od razu się kończy: to pole dokumentacja daje właśnie przeciw blokowaniu w kółko.
Wszystkie trzy to zwykłe skrypty Node, które przy własnym błędzie kończą się bez szkody dla sesji. Strażnik, który psuje sesję, jest gorszy niż brak strażnika.
Dziewięć skilli
| Skill | Kto uruchamia | Co robi |
|---|---|---|
code |
ja albo Claude | pętla kodowania: przeczytaj wskazane strony, dopasuj się do kodu, sprawdź przed ogłoszeniem „gotowe” |
commit |
ja albo Claude | jeden Conventional Commit, przypięty do małego modelu Haiku, żeby szło szybko |
new-blog |
ja albo Claude | planuje, pisze i sprawdza wpis taki jak ten, z lintem czytelności i skryptem do zrzutów ekranu |
new-cv |
ja albo Claude | aktualizuje stronę CV i jej PDF-y z jednego pliku danych |
lighthouse-qa |
ja albo Claude | puszcza Lighthouse na zbudowanej stronie i poprawia w pętli |
wiki-lint |
ja albo Claude | uruchamia mechaniczny lint wiki, a potem czyta strony pod kątem sprzeczności |
awwwards |
tylko Claude | ogląda nagradzane strony w prawdziwej przeglądarce, żeby podnieść jedną płaską sekcję |
search-registry-items |
tylko Claude | szuka komponentu w publicznych rejestrach shadcn przez serwer MCP |
start-project-info |
tylko ja | zakłada wiki, tabelę routingu, lekcje i hooki w nowym projekcie |
Skill „tylko Claude” ma user-invocable: false: to wiedza w tle, która nie ma sensu jako komenda. Skill „tylko ja” ma disable-model-invocation: true: zapisuje sporo plików, więc odpalam go sam, a do tego czasu jego opis nic nie kosztuje. Jak new-cv trzyma stronę i PDF w zgodzie, opisuję we wpisie CV jako strona i PDF z jednego źródła.
Trzy serwery MCP
Żaden nie jest skonfigurowany w tym repozytorium. Siedzą na poziomie użytkownika, więc każdy projekt może z nich korzystać.
- Mobbin, biblioteka prawdziwych ekranów aplikacji i stron. Jej serwer MCP pozwala agentowi szukać w niej zwykłymi słowami i dostawać ekrany. Korzystałem z niego przy researchu sekcji, zanim je projektowałem.
- Shoogle, wyszukiwarka bloków shadcn/ui w wielu rejestrach. Skill
search-registry-itemsmówi Claude'owi, kiedy po nią sięgnąć. - Prawdziwa przeglądarka. Playwright MCP steruje przeglądarką przez snapshoty drzewa dostępności, a Claude in Chrome łączy Claude Code z samym Chrome, razem z jego stanem logowania.
Dokumentacja MCP ma ostrzeżenie, które warto powtórzyć: ufaj każdemu serwerowi, który dodajesz, bo te, które pobierają treści z zewnątrz, narażają Cię na prompt injection.
Subagenty
Nie mam własnych definicji subagentów, wbudowane wystarczyły. Z etapu planowania log wiki odnotowuje jedną partię 8 agentów badawczych i jedną 3, każdy z osobnym tematem. Zapisywały surowe notatki, a ja przenosiłem wnioski do stron, do których prowadzi routing.
Wyszła z tego jedna lekcja: równoległe agenty dzielą jeden budżet wyszukiwania w sieci i potrafią go wyczerpać. Lepiej pobierać adresy, które już znasz.
Jak te elementy się łączą?
Elementy robią się naprawdę przydatne, kiedy łatają nawzajem swoje słabe strony.
- Skill + MCP. Serwer daje Claude'owi narzędzie, a skill mówi, kiedy warto po nie sięgnąć i co zrobić z wynikiem. Dokumentacja opisuje dokładnie ten wzorzec.
- CLAUDE.md + hook. Tabela routingu to zwykły markdown, który sam czytam i edytuję. Hook promptu parsuje tę samą tabelę, więc nowy wiersz wystarczy, żeby nowa strona trafiała do właściwych zadań.
- Hook + skill.
wiki-check.mjsto część mechaniczna: ścieżki istnieją, każda strona jest w spisie, wpisy w logu mają właściwy format. Skillwiki-lintto część wymagająca osądu: czy dwie strony sobie przeczą? Skrypt nie oceni sensu, a na modelu nie można polegać, że uruchomi się za każdym razem. - Skill + subagent. Skill może działać w osobnym subagencie (
context: fork), a subagent może mieć wczytane skille z góry. Nie używam ani jednego, ani drugiego, alenew-blogrobi prostszą wersję: w ostatnim kroku daje gotowy wpis świeżemu subagentowi do przeczytania na zimno.
Ograniczenia
- Hooki z komendami działają z pełnymi uprawnieniami Twojego użytkownika. Dokumentacja hooków mówi to otwarcie. Przeczytaj każdy hook, zanim go dodasz, zwłaszcza skopiowany z cudzego repozytorium.
- Opisy skilli nie są darmowe. Każdy skill, który Claude może sam wywołać, trzyma opis w kontekście, a lista ma swój budżet. Gdy się przepełni, Claude Code wycina opisy skilli wywoływanych najrzadziej. Mętne albo nakładające się opisy sprawiają też, że Claude wybiera nie ten skill.
- Routing po słowach kluczowych się myli. Mój hook liczy słowa, a nie znaczenie. Na początku ogólna fraza w jednym wierszu przebiła nazwę projektu w innym i wycięła stronę, która była potrzebna. Poprawka była nudna: wspólne słowa zadań wpisać do każdego wiersza, którego dotyczą, i ponownie uruchomić tryb
--test. - Subagent zaczyna od zera. Widzi tylko wiadomość z poleceniem, a nie Twoją rozmowę, więc mętne zlecenie wraca mętnym podsumowaniem. Jego zapytania też liczą się do Twojego limitu.
- Nie zmierzyłem oszczędności. Nie podam liczby tokenów ani minut, które dają te hooki. Mogę powiedzieć tyle: po kompaktowaniu kolejna tura zaczyna się od reguł, a nie od tego, że powtarzam je od nowa.
Od czego zacząć?
Najpierw krótki CLAUDE.md, a każdy kolejny element dopiero wtedy, gdy pojawi się jego sygnał. Jeśli dopiero zaczynasz, zajrzyj do przewodnika Claude Code po polsku. Cały proces, na którym powstała ta strona, opisuję w studium przypadku, a projekty znajdziesz na stronie z pracami.
Źródła
- Extend Claude Code (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Extend Claude with skills (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Hooks reference (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Automate actions with hooks (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Connect Claude Code to tools via MCP (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Create custom subagents (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- How Claude remembers your project (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Use Claude Code with Chrome (dokumentacja Claude Code) (otwiera się w nowej karcie) (dostęp: )
- Playwright MCP (GitHub, Microsoft) (otwiera się w nowej karcie) (dostęp: )
- Shoogle: search shadcn/ui blocks across registries (GitHub) (otwiera się w nowej karcie) (dostęp: )
- Mobbin (otwiera się w nowej karcie) (dostęp: )