Integracje z zewnętrznymi API w Claude Code
Claude Code buduje produkcyjne integracje z usługami zewnętrznymi (płatności Stripe, e-maile transakcyjne, logowanie OAuth 2.0 i przychodzące webhooki), gdy prompt z góry nazywa zdarzenia, klucz idempotentności i kategorie błędów. Wtyczki dostawców lub serwery MCP dostarczają aktualną dokumentację API, a odtwarzane zdarzenia testowe, testy podpisów i testy podwójnego doręczenia dowodzą poprawności bez czytania kodu linijka po linijce.
Subskrypcje Stripe mają działać w czwartek. Płatność z quickstartu działa po godzinie, a potem przychodzą zduplikowane webhooki, zdarzenia docierające przed przekierowaniem, proxy psujące weryfikację podpisu i e-mail windykacyjny, którego nikt nie napisał. Ta strona jest dla programistów, którzy podłączają zewnętrzne usługi do aplikacji w Claude Code, oraz dla tech leadów, którzy chcą, żeby każda integracja przechodziła te same kontrole, zanim trafi na main.
Co zyskasz, budując integracje w Claude Code
Dział zatytułowany „Co zyskasz, budując integracje w Claude Code”- Konfigurację, która daje Claude Code aktualną dokumentację dostawcy: przez oficjalne wtyczki Stripe i Resend albo przez Context7 dla każdej innej biblioteki.
- Macierz zdarzeń: jednostronicowy kontrakt, który człowiek przegląda zamiast kodu handlerów.
- Pięć promptów do skopiowania: macierz zdarzeń, wycinek Stripe pisany od testów, e-maile transakcyjne, logowanie OAuth 2.0 z PKCE i wspólna skrzynka webhooków.
- Zestaw weryfikacji (podpisane fikstury, powtórki podwójnych i nieuporządkowanych doręczeń, Stripe CLI i hook
Stop), który dowodzi działania integracji bez czytania każdej linii. - Awarie, które docierają na produkcję, każdą ze sposobem naprawy.
Jak dać Claude Code aktualną dokumentację dostawcy?
Dział zatytułowany „Jak dać Claude Code aktualną dokumentację dostawcy?”API płatności i poczty zmieniają się szybciej niż dane treningowe dowolnego modelu. Agent piszący pod zeszłoroczne API produkuje kod, który się kompiluje, a potem wywraca się w czasie działania. Zanim wyślesz pierwszy prompt, podłącz do sesji żywe źródło. Trzy drogi, od najbardziej do najmniej szczegółowej:
| Droga | Co dodaje | Instalacja (terminal) | Kiedy jej użyć |
|---|---|---|---|
| Wtyczka Stripe | Skille Stripe (stripe-best-practices, upgrade-stripe i inne) oraz jego serwer MCP, aktualizowane automatycznie | claude plugin install stripe@claude-plugins-official | Wszystko, co dotyka Stripe |
| Wtyczka Resend | Skille Resend (resend, react-email, email-best-practices i inne) oraz hostowany serwer MCP Resend (OAuth) | claude plugin marketplace add resend/resend-skills, potem claude plugin install resend@resend-skills | E-maile transakcyjne przez Resend |
| Context7 MCP | Dokumentacja konkretnych wersji większości publicznych bibliotek | claude mcp add --transport http context7 https://mcp.context7.com/mcp | Każdy dostawca bez własnej wtyczki (klucz API jest opcjonalny i podnosi limity) |
Polecenia instalacji pochodzą z repozytoriów dostawców: stripe/ai, resend/resend-skills i upstash/context7. Zakresy i położenie .mcp.json opisuje konfiguracja MCP w Claude Code. Narzędzia i użycie Context7 znajdziesz na stronie Context7. Proces opisany na tej stronie działa bez zmian z innymi agentami, różni się tylko instalacja. W Codeksie wtyczkę Stripe instalujesz poleceniem codex plugin add stripe@openai-curated (zobacz konfigurację MCP w Codeksie), a użytkownicy Cursora zaczynają od konfiguracji MCP w Cursorze.
Jeśli zespół woli lokalny serwer MCP Stripe w .mcp.json zapisanym w repozytorium, odwołaj się do klucza zamiast go wklejać. Serwer czyta STRIPE_SECRET_KEY ze swojego środowiska, a Claude Code rozwija ${VAR} przy starcie:
claude mcp add stripe --scope project \ -e 'STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}' \ -- npx -y @stripe/mcp@0.3.3Który model? Zostań przy domyślnym modelu Claude Code, czyli Claude Opus 5.5 na kanale latest, który działa z wysiłkiem medium. Zanim zmienisz model, podnieś wysiłek poleceniem /effort high. Kanał stable 26 września 2026 r. miał jeszcze starsze ustawienia domyślne, więc jeśli korzystasz z kanału stable (cask Homebrew claude-code, npm stable albo autoUpdatesChannel: "stable"), sprawdź model poleceniem /model. Claude Fable 5.1 (/model fable) wybieraj świadomie, tylko do długiego przepisywania wielu integracji, którego według twoich własnych prób Opus 5.5 nie kończy. Ceny i ustawienia domyślne dla planów są w zestawieniu modeli.
Napisz macierz zdarzeń przed pierwszym handlerem
Dział zatytułowany „Napisz macierz zdarzeń przed pierwszym handlerem”Większość błędów integracji to błędy stanu, a nie HTTP: zdarzenie przetworzone dwa razy, zdarzenie, które przychodzi przed wierszem, który ma zaktualizować, ponowienie wysyłające drugi e-mail. Lekarstwem jest kontrakt, który wymienia każde przychodzące zdarzenie, jego klucz idempotentności, dozwolone przejście stanu i skutki uboczne. Człowiek przegląda tę tabelę, a nie 800 linii, które ją implementują.
| Event | Idempotency key | Allowed transition | Side effects | Retry on failure? ||--------------------------------|-----------------|-----------------------------|-------------------------------|-------------------|| checkout.session.completed | event.id | order pending -> paid | grant entitlement, receipt | yes (5xx, network)|| invoice.payment_failed | event.id (email: invoice.id) | subscription active -> past_due | dunning email (once per invoice) | yes || customer.subscription.deleted | event.id | any -> cancelled | revoke entitlement | yes || charge.refunded | event.id | paid -> refunded | revoke entitlement, notify | yes || anything else | — | none | log and return 200 | no |Dodaj dwie linie do CLAUDE.md, żeby każda sesja trzymała się kontraktu: „Integration contracts live in docs/integrations/. Change the table first, in its own commit, and never add a handler for an event that is not in it.” Zobacz, jak Claude Code wczytuje pliki pamięci.
Zbuduj integrację płatności Stripe krok po kroku
Dział zatytułowany „Zbuduj integrację płatności Stripe krok po kroku”-
Przygotuj macierz zdarzeń w trybie planowania.
Uruchom
claude --permission-mode planalbo wpisz/planw działającej sesji. Claude Code czyta kod i proponuje zmiany, ale niczego nie edytuje.Przejrzyj tabelę, odpowiedz na otwarte pytania i zatwierdź ją w osobnym commicie.
-
Zaimplementuj jeden wycinek, zaczynając od testów.
Wyjdź z trybu planowania klawiszami Shift+Tab. Testy podpisują zdarzenia helperem samego Stripe, więc dowodzą obsługi podpisu, zamiast ją zamockować.
-
Odtwórz prawdziwe zdarzenia na działającej aplikacji.
Testy jednostkowe dowodzą logiki, Stripe CLI dowodzi połączeń. W jednym terminalu:
Okno terminala stripe listen --forward-to http://localhost:3000/api/webhooks/stripestripe listenwypisuje przy starcie sekret podpisywania webhooków (whsec_…). Wpisz go do lokalnego.envjakoSTRIPE_WEBHOOK_SECRET, zrestartuj aplikację, a potem w drugim terminalu:Okno terminala stripe trigger checkout.session.completedstripe trigger invoice.payment_failedKażde wywołanie powinno pojawić się w wyjściu
stripe listenze statusem200i dokładnie raz w tabeliwebhook_events. -
Domknij przypadki brzegowe, które wymienia macierz.
The happy path passes. Now handle: 1) the webhook arrives before theCheckout redirect returns, so the order row may still be pending;2) a failed subscription payment sends a dunning email through ouremail service at most once per invoice; 3) a refund updates the orderand revokes the entitlement. Add a failing test for each case first.
Dodaj e-maile transakcyjne przez Resend
Dział zatytułowany „Dodaj e-maile transakcyjne przez Resend”E-mail wygląda banalnie, dopóki ponowienie nie wyśle dwóch linków do resetu hasła albo pętla odbić nie spowoduje dławienia twojej domeny. Poproś wprost o zachowanie w razie błędów i trzymaj pocztę z developmentu z dala od prawdziwych skrzynek.
Nie wpisuj z pamięci limitu żądań na sekundę. Odczytaj aktualny limit swojego konta w panelu Resend i zapisz go w docs/integrations/resend.md, żeby agent korzystał z udokumentowanej liczby.
Dodaj logowanie OAuth 2.0 przez Google i GitHub
Dział zatytułowany „Dodaj logowanie OAuth 2.0 przez Google i GitHub”Błędy w OAuth to błędy bezpieczeństwa, więc prompt nazywa zabezpieczenia, a nie tylko przepływ. Liczą się dwie rzeczy: weryfikuj state przy każdym callbacku i używaj przepływu authorization code z PKCE dla klientów mobilnych i SPA. Nigdy nie zwracaj tokenów we fragmencie URL: to stary przepływ implicit, przed którym przestrzega OAuth 2.0 Security Best Current Practice (RFC 9700).
Kieruj webhooki wszystkich dostawców do jednej skrzynki
Dział zatytułowany „Kieruj webhooki wszystkich dostawców do jednej skrzynki”Gdy odbierasz webhooki od trzech dostawców, daj im jeden potok: weryfikacja, zapis, deduplikacja, przetwarzanie, kolejka martwych komunikatów (dead-letter queue, DLQ). Nowa integracja dodaje wtedy weryfikator i handler, a nie nowy zestaw sposobów na awarię.
Kierunek odwrotny, czyli wysyłanie podpisanych webhooków do własnych klientów, opisuje strona budowanie API REST i GraphQL w Claude Code.
SDK dostawcy czy klient wygenerowany przez Claude Code?
Dział zatytułowany „SDK dostawcy czy klient wygenerowany przez Claude Code?”| Sytuacja | Wybierz | Dlaczego |
|---|---|---|
| Dostawca utrzymuje oficjalne SDK (Stripe, Resend) | SDK | Ma weryfikację podpisów, ponowienia i przypinanie wersji API, które wygenerowany klient musiałby wymyślać od nowa |
| Brak oficjalnego SDK dla twojego języka lub runtime’u albo SDK nie działa na twoim runtime brzegowym | Wygenerowany typowany klient na fetch | Małe, widoczne wywołania HTTP; poproś o typowane błędy niosące kod błędu dostawcy |
| Wołasz dwa lub trzy endpointy dużego API | Wygenerowany klient tylko dla tych endpointów | Unikasz ciężkiej zależności dla wąskiego zastosowania |
| Weryfikacja wrażliwa na bezpieczeństwo (podpisy webhooków, walidacja JWT) | Nigdy ręcznie pisana, jeśli SDK lub sprawdzona biblioteka to oferuje | Porównanie w stałym czasie i tolerancję przesunięcia zegara łatwo zepsuć w subtelny sposób |
Jak udowodnić, że integracja działa, bez czytania każdej linii?
Dział zatytułowany „Jak udowodnić, że integracja działa, bez czytania każdej linii?”Przeglądaj macierz zdarzeń i testy, a kod niech sprawdzają bramki. Integracja gotowa do merge’a przechodzi wszystkie poniższe:
- Podpisane testy na fiksturach dla każdego wiersza macierzy: poprawny, brakujący i zmieniony podpis; podwójne doręczenie; doręczenie w złej kolejności; handler rzucający wyjątek zwraca 5xx. Testy podpisują payloady helperem dostawcy, więc zamockowany weryfikator je oblewa.
- Odtworzenie na żywo poleceniem
stripe triggerdla każdego obsługiwanego zdarzenia, sprawdzone w wyjściustripe listeni w tabeli skrzynki. - Hook
Stop, który uruchamia zestaw testów integracji i nie pozwala sesji zakończyć się na czerwono (konfiguracja jest pod listą). /code-reviewi/security-revieww sesji, zanim otworzysz pull request. Oba są wbudowane w Claude Code: pierwsze przegląda diff pod kątem poprawności, drugie robi przegląd tych samych zmian pod kątem bezpieczeństwa.- Sygnały z produkcji: każde przetworzone zdarzenie loguje dostawcę, ID zdarzenia i wynik, a alert odpala się, gdy liczba zdarzeń w kolejce DLQ jest większa od zera. Zobacz monitoring z Claude Code.
Hook Stop zamienia zdanie „integracja działa” w twierdzenie poparte przebiegiem testów. Zapisz skrypt, nadaj mu prawo wykonania (chmod +x) i zarejestruj go w .claude/settings.json:
#!/usr/bin/env bash# .claude/hooks/integration-tests.sh (Stop)set -uo pipefailinput=$(cat)if out=$(npm test --silent -- tests/integrations </dev/null 2>&1); then exit 0; fiif [[ $(jq -r '.stop_hook_active' <<<"$input") == "true" ]]; then jq -nc '{systemMessage: "Integration tests still fail after one retry. Stopping for a human."}' exit 0fijq -nc --arg r "Integration tests fail. Fix them before you finish. Last 40 lines:$(tail -n 40 <<<"$out")" '{decision: "block", reason: $r}'{ "hooks": { "Stop": [ { "hooks": [{ "type": "command", "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/integration-tests.sh", "args": [], "timeout": 300 }] } ] }}Hook blokuje pierwsze zakończenie przy czerwonych testach, a jeśli ponowna próba też się nie uda, oddaje sprawę tobie. Kody wyjścia, flagę stop_hook_active i wersję pomijającą czyste drzewo robocze opisuje strona hooki Claude Code. Dlaczego bramki testowe zastępują czytanie kodu linijka po linijce, wyjaśnia strona dowody zamiast czytania kodu.
Kto zatwierdza: programista odpowiada za testy i odtworzenie zdarzeń, tech lead zatwierdza macierz zdarzeń i alert kolejki DLQ. Człowiek czyta linijka po linijce tylko weryfikację podpisów i wszystko, co przesuwa pieniądze.
Kiedy integracje z zewnętrznymi usługami się psują
Dział zatytułowany „Kiedy integracje z zewnętrznymi usługami się psują”Weryfikacja podpisu przechodzi lokalnie, a na produkcji zawodzi. Parser ciała żądania albo proxy zmienił surowe bajty, zanim zobaczył je weryfikator. Naprawa: „Mount the webhook route with express.raw before express.json, and add a test that sends a pretty-printed copy of a signed payload and expects 400.” Potem sprawdź, czy load balancer nie przepisuje ciał żądań.
Agent napisał kod pod nieaktualne API. Nazwy parametrów lub kształt zdarzeń nie zgadzają się z tym, co wysyła dostawca. Naprawa: zainstaluj wtyczkę dostawcy lub Context7, przypnij wersję API w docs/integrations/ i poproś: „Compare src/services/stripe.ts with the current Stripe API version using the plugin’s skills and list every call that changed.” Aktualizacje wersji obsługuje skill upgrade-stripe.
Testy przechodzą, bo weryfikację zamockowano. Wygenerowany test podmienia constructEvent tak, że zwraca payload, więc zestaw jest zielony dla każdego podpisu. Naprawa: uruchom powyższy prompt audytowy; wyłapuje to krok „weryfikator zawsze zwraca true”.
Zdarzenia przychodzą w złej kolejności. invoice.payment_failed dociera przed checkout.session.completed. Naprawa: „Make every handler check the current state and apply only the transitions the event matrix allows; add a test per out-of-order pair.”
Jeden webhook dał dwa e-maile albo dwa nadania uprawnień. Idempotentność oparto na czymś innym niż ID zdarzenia albo skutek uboczny wykonał się, zanim zapis do skrzynki został zatwierdzony. Naprawa: „Write the inbox row and the side effect in one transaction, or make the side effect idempotent with its own key; add a duplicate-delivery test that fails today.”
Zadanie wsadowe trafia w limit żądań dostawcy. Naprawa: „Add a concurrency limiter to the client using the rate documented in docs/integrations/, retry 429 with backoff that honours Retry-After, and add a test with a mocked 429.”
Agent użył produkcyjnego klucza przez MCP. Naprawa: natychmiast unieważnij klucz w panelu dostawcy, przejrzyj dziennik zdarzeń dostawcy pod kątem wykonanych akcji i przełącz sesję na ograniczony klucz trybu testowego. Zobacz bezpieczeństwo MCP.
Dokąd dalej z integracjami
Dział zatytułowany „Dokąd dalej z integracjami”Wymaganie wstępne: konfiguracja MCP w Claude Code. Następny krok: testowanie z Claude Code przenosi podejście z podpisanymi fiksturami na resztę zestawu testów.